使用Regex从XML中删除命名空间引用

Sco*_*ott 1 regex xml

我有一个正则表达式从XML中删除xmlns引用.当匹配标记时它可以正常工作,但如果xmlns引用位于单个标记中,它也会删除"/".

这是正则表达式:

"<(.*?) xmlns[:=].*?>", "<$1>"
Run Code Online (Sandbox Code Playgroud)

当我在这行xml上使用正则表达式时:

<ns22:someTagName xmlns:ns22="http://exampledatatypes.com"></ns22:someTagName>
Run Code Online (Sandbox Code Playgroud)

我得到了我想要的东西:

<ns22:someTagName></ns22:someTagName>
Run Code Online (Sandbox Code Playgroud)

当我在这行xml上使用正则表达式时:

<ns22:someTagName xmlns:ns22="http://exampledatatypes.com"/>
Run Code Online (Sandbox Code Playgroud)

我得到这个无效的XML:

<ns22:someTagName>
Run Code Online (Sandbox Code Playgroud)

它删除了引用罚款,但它用"/"结束.

谢谢你的帮助,斯科特

And*_*are 5

不是试图从XML中保留您需要的内容,而是最好定位要删除的内容.

此表达式仅针对名称空间本身:

\sxmlns[^"]+"[^"]+"

不幸的是我不知道LotusScript所以我不能给你一个如何使用它的代码示例,但你需要做的就像这样的psuedocode:

result = regex.replace(yourString, '\sxmlns[^"]+"[^"]+"', '')
Run Code Online (Sandbox Code Playgroud)

你将在这里做的是用空字符串替换所有匹配(有效地删除它们).这将适用于封闭和自闭合的XML标记,如果标记根本没有命名空间,它也可以工作.

编辑:这是一个功能齐全的Python示例:

>>> from re import sub
>>> pattern = r'\sxmlns[^"]+"[^"]+"'
>>> closed = r'<ns22:someTagName xmlns:ns22="http://exampledatatypes.com"></ns22:someTagName>'
>>> sub(pattern, '', closed)
'<ns22:someTagName></ns22:someTagName>'
>>> selfclosed = r'<ns22:someTagName xmlns:ns22="http://exampledatatypes.com"/>'
>>> sub(pattern, '', selfclosed)
'<ns22:someTagName/>'
Run Code Online (Sandbox Code Playgroud)