使用sed命令去除命名空间前缀

3

I want to convert this piece of xml:

<v1:table>
  <v1:tr>
    <v1:td>Apples</v1:td>
    <v1:td>Bananas</v1:td>
  </v1:tr>
</v1:table>

使用sed将命名空间前缀(即v1)删除,得到以下内容:
<table>
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>

这是可能的吗?

编辑:我还要说明xml保存在文件中。


不,使用 sed 是不可能的:sed 基于正则表达式,而 XML 不是一种正则语言。考虑使用真正的 XML 解析器。你可能会看到一些答案给出了在你特定的玩具示例上似乎可以工作的代码片段,但很容易伪造一个(有效的 XML)文件使其失败。 - gniourf_gniourf
你不想移除命名空间,请停止尝试。解释一下你真正想要实现的目标(或者为什么你认为移除命名空间会对你有帮助)。 - Tomalak
1
我想使用Spring Framework的XStreamMarshaller将xml转换为Java类。为了使标签与类字段完全相同,我想要去掉前缀。在运行Spring批处理之前,我只使用bash和sed,因此我倾向于使用sed。 - vahdet
2个回答

4

使用来自W3C HTML-XML-utilshxpipehxunpipe,您可以按以下方式完成操作(已经为打包多种发行版)。

$ hxpipe infile | sed 's/^\([()]\)v1:/\1/g' | hxunpipe
<table>
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>

hxpipe解析XML/HTML并将其转换为基于行的格式,方便awk/sed处理:

$ hxpipe infile
(v1:table
-\n  
(v1:tr
-\n    
(v1:td
-Apples
)v1:td
-\n    
(v1:td
-Bananas
)v1:td
-\n  
)v1:tr
-\n
)v1:table
-\n

其中以 () 开头的行是开放和闭合标签,因此从以 () 开头的行中删除第一个 v1:(这就是上面的 sed 命令所做的)可以实现期望的效果。请注意,文本行以 - 开头,因此不会出现任何误报。


1

这个sed在你的例子中可以工作:

sed -E 's~(</?)v1:~\1~g' file

<table>
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>

然而需要注意的是,sed 并不是解析 HTML/XML 最好的工具。建议使用 HTML 解析器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接