【问题标题】:Remove Namespace references from XML with Regex使用 Regex 从 XML 中删除命名空间引用
【发布时间】:2021-02-25 00:04:11
【问题描述】:

我有一个从 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>

它很好地删除了引用,但它带有结束的“/”。

感谢您的帮助, 斯科特

【问题讨论】:

  • 不要对 XML 使用正则表达式。你使用什么编程语言?毫无疑问,有一个出色的 XML API 可以让您轻松删除命名空间。

标签: xml regex


【解决方案1】:

与其试图从 XML 中保留您需要的内容,不如针对您想要删除的内容。

这个表达式只针对命名空间本身:

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

不幸的是,我不了解 LotusScript,所以我无法为您提供如何使用它的代码示例,但您需要做的是类似这样的伪代码:

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/>'

【讨论】:

  • 嗯。我试过了,它没有看到做任何事情。在 LS 中,您需要“与另一个”一起逃脱。这是我尝试过的: ExecuteReplace(sXML, "xmlns[^""]+""[^""]+""", "")
  • 嗨,安德鲁,我让它工作了,但它在删除引用的标签中留下了空白。有没有办法清除空白? ExecuteReplace(sXML, "xmlns[^""]+""[^""]+""", "")
  • @Scott - 我将表达式更改为:\sxmlns[^"]+"[^"]+" 以处理空格问题。
  • 我在 xmlns 前面添加了一个空格并修复了它:ExecuteReplace(sXML, " xmlns[^""]+""[^""]+""", "")。感谢您的帮助。
【解决方案2】:

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”来手动仔细检查。

【讨论】:

    【解决方案3】:

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

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

    https://regexr.com/ 是用于编写/测试这些的好工具。

    【讨论】:

      猜你喜欢
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 2012-07-29
      • 2011-06-07
      • 2020-08-30
      • 1970-01-01
      相关资源
      最近更新 更多