如何使用 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
代码
使用!
作为分隔符,所以/
不需要转义;
搜索字符串通过替换 \|
匹配 </
或 <
;
替换由匹配的部分本身组成,&
,后跟ns:
;
所有这些都是通过g
在整条线上完成的。
您在评论中说您想跳过以<?xml
开头的行的提交,但更改s
命令只会使其更长且可读性降低。
由于该行始终是第一行,因此您可以通过在s
命令前添加2,$
来定位除第一行之外的所有行。
【讨论】:
这正是我要找的...只需要跳过第一行 (<?xml...
)。以上是关于如何使用 sed 向每个 XML 节点添加命名空间的主要内容,如果未能解决你的问题,请参考以下文章