如何使用 sed 向每个 XML 节点添加命名空间

Posted

技术标签:

【中文标题】如何使用 sed 向每个 XML 节点添加命名空间【英文标题】:How to add a namespace to each XML node with sed 【发布时间】:2021-12-01 02:55:48 【问题描述】:

给定以下 XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response xmlns="...">
    <root>
        <test>abc</test>
    </root>
</response>

我需要像这样为每个元素添加一个命名空间:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns:response xmlns:ns="...">
    <ns:root>
        <ns:test>abc</ns:test>
    </ns:root>
</ns:response>

sed 可以吗?我知道sed 不是处理 XML 的最佳工具...

可能有嵌套节点,但没有一个已经拥有命名空间。最后,没有属性。

【问题讨论】:

如果没有更详细的说明您需要做什么,很难知道 - 对于给出的单个示例,您可以使用 s/test/ns:test/g 但我确定这不是您想要的。 我不知道节点的名称......我只需要一种简单的方法来将给定的命名空间添加到 XML 中的所有节点。您建议的解决方案意味着我知道标签... 我的建议是故意指出你没有给我们足够的信息。你曾经在同一行有两个标签吗?嵌套标签?标签是否包含字符串“ns:”?是否有任何标签已经 有命名空间前缀?它们中的任何一个都有属性吗?有没有自闭的?所有这些复杂性都可能使某些解决方案无效。 这可能会有所帮助:How do I add a namespace to all elements in a node? 好的,更新问题。 【参考方案1】:

对需求的描述如此简陋,您只能这样做:

sed 's!</\|<!&ns:!g' your_file

代码

使用!作为分隔符,所以/不需要转义; 搜索字符串通过替换 \| 匹配 &lt;/&lt;; 替换由匹配的部分本身组成,&amp;,后跟ns:; 所有这些都是通过g在整条线上完成的。

您在评论中说您想跳过以&lt;?xml 开头的行的提交,但更改s 命令只会使其更长且可读性降低。

由于该行始终是第一行,因此您可以通过在s 命令前添加2,$ 来定位除第一行之外的所有行。

【讨论】:

这正是我要找的...只需要跳过第一行 (&lt;?xml...)。

以上是关于如何使用 sed 向每个 XML 节点添加命名空间的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT 向 XML 有效负载添加不同的名称空间

将命名空间添加到 xml 根节点 c#

如何使用Xpath检索XML文件中的命名空间

XPATH 帮助:使用 XPathNodeIterator 在命名空间中查找 XML 节点

如何在命名空间环境中访问 SimpleXML 节点?

如何使用 xslt 将父节点命名空间复制到子元素?