シェルスクリプト - xmlのタグ間で値を取得する

シェルスクリプト - xmlのタグ間で値を取得する

私のXMLファイルの形式は次のとおりです。<fullName>..</fullName>ABCとDEFタグの間の値を取得したいです。fullName別の変数から各xmlタグの値を取得する必要があるため、各行に到達するためにwhileループでこのコードを書いています。grepすべての値が一緒に表示されます。

ありがとう

<fields>
    <fullName>ABC</fullName>
    <trackFeedHistory>false</trackFeedHistory>
    <type>TY</type>
</fields>

<fields>
    <fullName>DEF</fullName>
    <trackFeedHistory>false</trackFeedHistory>
    <type>XY</type>
</fields>

答え1

次の XML パーサーを使用します。xmlstarlet:

xmlstarlet sel -t -m '//fields' -v 'fullName' -n file

ファイルはxml有効でなければなりませんが、ルートタグがないため、この例では機能しません。上記のコマンドでは、次のものが使用されます。

<root>
<fields>
    <fullName>ABC</fullName>
    <trackFeedHistory>false</trackFeedHistory>
    <type>TY</type>
</fields>

<fields>
    <fullName>DEF</fullName>
    <trackFeedHistory>false</trackFeedHistory>
    <type>XY</type>
</fields>
</root>

出力:

ABC
DEF

@roaimasさんのコメントのおかげで、フィールドの数を知らずにforループを作成しましたが、結果は次のとおりです。xmlstarlet

numFields=$(xmlstarlet sel -t -m '//fields' -o "." file | wc -c)
for i in $(seq 1 $numFields); do
    var=$(xmlstarlet sel -t -m "//fields[$i]" -v "fullName" file)
    printf '%s\n' "$var" # or do something else
done

関連情報