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

时间:2011-02-24 16:09:12

标签: xml regex

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

这是正则表达式:

"<(.*?) xmlns[:=].*?>", "<$1>"

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

<ns22:someTagName xmlns:ns22="http://exampledatatypes.com"></ns22:someTagName>

我得到了我想要的东西:

<ns22:someTagName></ns22:someTagName>

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

<ns22:someTagName xmlns:ns22="http://exampledatatypes.com"/>

我得到了这个无效的XML:

<ns22:someTagName>

它会删除引用,但是它会以“/”结束。

感谢您的帮助, 斯科特

3 个答案:

答案 0 :(得分:5)

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

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

  

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

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

result = regex.replace(yourString, '\sxmlns[^"]+"[^"]+"', '')

你将在这里做的是用空字符串替换所有匹配(有效地删除它们)。这将适用于封闭和自闭合的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/>'

答案 1 :(得分:1)

Don't use regex on XML if you have access to an XML parser!话虽如此,我对LotusScript的XML解析功能一无所知(如果它还有它们),所以如果你必须使用正则表达式,这会让你更接近:

<([^>]*?)\bxmlns\b[^"']+('|").*?$2(.*?/?>)

替换为:

<$1$3

此处与原始正则表达式最重要的变化是/?到最后。顺便说一下,我还没有逃过qoutes或反斜杠,因为我不知道LotusScript的语法,我认为你这样做了。

由于limitations of regex,将始终存在无法正确理解的XML有效输入。但是,它适用于大多数情况。您可以通过以后搜索字符串“xmlns”来手动仔细检查。

答案 2 :(得分:0)

regex \s*xmlns(:\w+)?="[^"]*" 可以删除隐式/命名的 xmlns。

在 Java 中,xmlString.replaceFirst("\\s*xmlns(:\\w+)?=\"[^\"]*\"", "")

https://regexr.com/ 是用于编写/测试这些内容的绝佳工具。