name の値を取得し、XMLLint を使用して変数に入れたい
<body>
<value name="abc"></value>
</body>
echo 'cat //body/value/@name' | xmllint --shell "test.xml"
/ > -------
name="abc"
/ >
したがって、値「abc」を変数 $test に割り当てたい
引数の値を として返すfn:string()を使用する必要がありますxs:string
。引数が属性の場合、属性の値を として返しますxs:string
。
test=$(xmllint --xpath "string(//body/value/@name)" test.xml)
これを試してみてください。美しくはありませんが、機能します:)
>
stdout からを含む行を消去し、文字列をカットして の後の 2 番目の部分を取得し、 =
"
test=$(echo 'cat //body/value/@name' | xmllint --shell "test.xml" | grep -v ">" | cut -f 2 -d "=" | tr -d \");
echo $test
複数の属性をサポートするヘルパーawk
コマンドを使用したアプローチ(エゴのアプローチの合理化されたバージョン):
echo 'cat //*/@name' | xmllint --shell file | awk -F\" 'NR % 2 == 0 { print $2 }'
awk
コマンド:
xmllint
の出力行を"
文字ごとにフィールドに分割します。( -F\"
)
xmllint
属性値の周りの引用符を出力に正規化することに注意してください。したがって、 で分割するだけで十分です。"..."
'...'
"
は偶数行 ( ) のみを処理するため、常に出力NR %2 == 0
される区切り行が除外されます。cat
print $2
次に、2 番目のフィールドのみを出力します。これは、各属性の値であり、囲んでいる はありません"..."
。
に次のサンプル XML があるとしますfile
。
<body>
<value name="abc"></value>
<value name="def"></value>
</body>
上記の結果:
abc
def
最近、 --xpath を使用して、この機能を持たないプラットフォームに元のより単純なソリューションを移植する必要があったため、「猫」ソリューションも採用する必要がありました。これは、Ubuntu 12.04 および Solaris 11 でテストされた複数の一致を処理します。
getxml() { # $1 = xml file, $2 = xpath expression
echo "cat $2" | xmllint --shell $1 |\
sed -n 's/[^\"]*\"\([^\"]*\)\"[^\"]*/\1/gp'
}
たとえば、glassfish ドメイン構成からインスタンス名を抽出します。
$ getxml /tmp/test.xml "//server[@node-ref]/@name"
inst1
inst2
sed 後処理は、私のニーズに適したすべての引用された値を取得するだけです (glassfish 構成のビットを取得します)。
複数の行を一致させ、それらの同名属性の値を抽出し、以前の回答に基づいて構築することを目標に、これは私にとってはうまくいきました。
xmllint --xpath "//*/@value" file.xml | awk -F\" '{ print $2 }'