web-dev-qa-db-ja.com

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

xmlstarletなどのXML対応ツールを使用して、入力XMLを変換して、このような<Name/>要素を区別することは可能ですか?その場合、どのように行いますか?

<Names>
    <Name1>Luigi</Name1>
    <Name2>Mario</Name2>
    <Name3>Peach</Name3>
</Names>
2
roaima

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でカウンターをインクリメントすることに関して私が見つけたいくつかの投稿は次のとおりです。

そして、ここに私が使用した他のいくつかの参照がありました:

2
igal