Xml

將 XML 元素重命名為序列

  • November 11, 2017

我正在尋找另一個問題的可能的基於 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>

我使用 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 中增加計數器的文章:

以下是我使用的其他一些參考資料:

引用自:https://unix.stackexchange.com/questions/403839