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でカウンターインクリメントについて見つけた投稿です。

私が使用した他の参考資料は次のとおりです。

おすすめ記事