我有一个从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>
它会删除引用,但是它会以“/”结束。
感谢您的帮助, 斯科特
答案 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/ 是用于编写/测试这些内容的绝佳工具。