我正在寻找一种可能的基于 XML 的解决方案另一个问题。我知道它接受的答案,提供sed
和python
解决方案。
给定的 XML 片段是:
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
要求将<Name/>
元素名称更改为序列<Name1/>
, <Name2/>
,<Name3/>
等。
使用xmlstarlet
我可以将<Name/>
元素值重命名为固定值,如下所示
xmlstarlet ed -u '//Name' -v 'Another' names.xml
<Names>
<Another>Luigi</Another>
<Another>Mario</Another>
<Another>Peach</Another>
</Names>
-x
我什至可以将元素值更改为带有( )的表达式--expr
。
但是对于编辑元素名称本身,没有-x
( --expr
) 选项可以替代-v
( --value
) 选项,所以我不能使用这样的东西:
xmlstarlet ed -u '//Name' -x 'concat(., position())' names.xml
使用诸如 之类的 XML 感知工具xmlstarlet
,是否可以转换输入 XML 以区分<Name/>
这样的元素,如果可以,如何实现?
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
答案1
我使用 XML 命令行工具的经验让我感觉还有很多不足之处。我几乎无一例外地发现自己放弃了,只使用 Python。也就是说,我认为我有一个可以与该basex
实用程序一起使用的 XQuery 解决方案来解决这个问题。这是 XQuery 表达式:
<!-- xml_rename_sequence.xquery -->
for $name at $position in doc('names.xml')//Name
return rename node $name as concat(name($name),$position)
这是 XML 数据文件:
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
以下是我们运行脚本的方式(它就地修改文件):
basex -u xml_rename_sequence.xquery
这是更新后的数据文件:
<!-- names.xml -->
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
我还尝试使用以下工具(但没有成功):
以下是我发现的一些关于在 XQuery 中增加计数器的帖子:
以下是我使用的其他一些参考资料: