将 XML 元素重命名为序列

将 XML 元素重命名为序列

我正在寻找一种可能的基于 XML 的解决方案另一个问题。我知道它接受的答案,提供sedpython解决方案。

给定的 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 中增加计数器的帖子:

以下是我使用的其他一些参考资料:

相关内容