如何使用 sed 为每个 XML 节点添加命名空间
How to add a namespace to each XML node with sed
给出以下 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...
的最佳工具
可能有嵌套节点,但没有人已经拥有命名空间。最后,没有属性。
有了如此简单的需求描述,您不能做更多的事情了:
sed 's!</\|<!&ns:!g' your_file
代码
- 使用
!
作为分隔符,所以/
不需要转义;
- 搜索字符串通过交替
\|
; 匹配 </
或 <
- 替换由匹配的棋子本身组成,
&
,后跟 ns:
;
- 所有这些都是通过
g
在整条线上完成的。
在评论中你说你想跳过以 <?xml
开头的行的提交,但更改 s
命令只会让它变得更长且更难阅读。
由于该行始终且仅是第一行,因此您可以通过在 s
命令前加上 2,$
来定位除第一行之外的所有行。
给出以下 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...
可能有嵌套节点,但没有人已经拥有命名空间。最后,没有属性。
有了如此简单的需求描述,您不能做更多的事情了:
sed 's!</\|<!&ns:!g' your_file
代码
- 使用
!
作为分隔符,所以/
不需要转义; - 搜索字符串通过交替
\|
; 匹配 - 替换由匹配的棋子本身组成,
&
,后跟ns:
; - 所有这些都是通过
g
在整条线上完成的。
</
或 <
在评论中你说你想跳过以 <?xml
开头的行的提交,但更改 s
命令只会让它变得更长且更难阅读。
由于该行始终且仅是第一行,因此您可以通过在 s
命令前加上 2,$
来定位除第一行之外的所有行。