XMLファイルの指定されたタグ内にタグ文字チェーンを埋め込む方法

XMLファイルの指定されたタグ内にタグ文字チェーンを埋め込む方法

XMLファイルで指定されたタグ内にタグ文字チェーンを埋め込むxmlstarletコマンドは何ですか?

例:タグが表示されるすべてのアイテムを検索<b>し、そのタグがタグ内にある場合にのみ削除します<c> ... </c>

  • 入力例:
    <c>This is <b>an example</b>. <a>This is <b>a test;</b></a></c>
    
  • 希望の出力:
    <c>This is an example. <a>This is <b>a test;</b></a></c>
    

要約のために、例の2番目の文を保持します。

<a>This is <b>a test;</b></a>

しかし、これが問題になったら無視しても構いません。

答え1

--updateノードの値を//c/b親ノードにコピーし、--delete現在不要なノードを削除するだけですb

これは私が最後に取ったアプローチに似ています。あなたの質問に対する以前の答えの1つxmlstarlet、最初に処理する必要があるすべてのノードのコレクションを保持する内部変数を作成し、そのノードを処理します。更新および削除操作のために同じノードセットにアクセスしやすくするために、これを行います。以前の答えでは、必要しかし、ここでは読みやすさのためです。

xmlstarlet ed \
    --var 'path' '//c/b' \
    --update '$path/../text()[1]' --expr 'concat(., $path/text())' \
    --delete '$path' file.xml

ここでの更新は、bノードの親ノードに対するものではなく、親ノードに対するものであることに注目する価値があります。最初のテキスト値text()[1].サンプル文書では、ノードの親ノードの最初のテキスト値は//c/b文字列ですThis is。これ第二テキスト値はノード.の後に​​続きますb。何も選ばないと[1]結局

<?xml version="1.0"?>
<c>This is an example. an example<a>This is <b>a test;</b></a></c>

つまり、文字列はノードの2つのテキスト値の後にan example挿入されます。c

今私達は得ます。

<?xml version="1.0"?>
<c>This is an example. <a>This is <b>a test;</b></a></c>

関連情報