xmllintとXPathを使用して属性から値を取得するにはどうすればよいですか?
<body>
<value name="abc"></value>
</body>
echo 'cat //body/value/@name' | xmllint --shell "test.xml"
/> -------
name="abc"
/>
を使用して変数に入れたい
xmllintとXPathを使用して属性から値を取得するにはどうすればよいですか?
<body>
<value name="abc"></value>
</body>
echo 'cat //body/value/@name' | xmllint --shell "test.xml"
/> -------
name="abc"
/>
を使用して変数に入れたい
これを試してみてください、それは美しいではないですが、それは動作します:)
私は、標準出力から>
を含む行を消去=
後の第二の部分を取得するには、文字列をカットし、
test=$(echo 'cat //body/value/@name' | xmllint --shell "test.xml" | grep -v ">" | cut -f 2 -d "=" | tr -d \");
echo $test
」を削除します
fn:string()を使用する必要があります。これは、引数の値をxs:string
として返します。引数が属性の場合、属性の値はxs:string
として返されます。
test=$(xmllint --xpath "string(//body/value/@name)" test.xml)
私は最近、この機能を欠いているプラットフォームに--xpath使用してポートに私の元の簡単な解決策を持っていたので、あまりにも「猫」ソリューションを採用しなければなりませんでした。これにより、Ubuntu 12.04とSolaris 11でテストされた複数のマッチが処理されます。
getxml() { # $1 = xml file, $2 = xpath expression
echo "cat $2" | xmllint --shell $1 |\
sed -n 's/[^\"]*\"\([^\"]*\)\"[^\"]*/\1/gp'
}
$ getxml /tmp/test.xml "//server[@node-ref]/@name"
inst1
inst2
sedの後処理がちょうど(GlassFishの設定のビットを取得)私のニーズに十分であったすべての引用された値をつかむ:GlassFishのドメイン設定からインスタンス名を抽出します。
複数の属性(ego's approachの合理化されたバージョン)をサポートしていヘルパーawk
コマンドとアプローチ:
echo 'cat //*/@name' | xmllint --shell file | awk -F\" 'NR % 2 == 0 { print $2 }'
awk
コマンド:
分割xmllint
の出力を行をフィールドに"
文字で区切ります。 xmllint
が入力'...'
を持っていた場合でも、出力に"..."
に属性値の周りに引用正規化し、それが"
によって分割するのに十分だと(-F\"
)
は、それによってcat
が常に印刷区切り線をフィルタリング、偶数ライン(NR %2 == 0
)を処理します。
print $2
プリント"..."
を封入せずに、各属性の値のみ2ndフィールド、。
と仮定すると、file
で次のサンプルXML:
<body>
<value name="abc"></value>
<value name="def"></value>
</body>
上記利回り:
abc
def
これは私のために完璧に動作します、ありがとう。あなたはまた、異なる変数に値を割り当てる良い方法がありますか? VAR_1 = $(echo 'cat // */@ name' | xmllint - シェルファイル| awk -F \ "'NR%2 == 0 {print $ 2}')? – dieHellste
@dieHellste:' read'出力行を変数に( 'while'ループで、' Bashで 'read-a'で配列に)追加のガイダンスが必要な場合は、新しい質問をしてください。 – mklement0
使用xmllintあなたはXMLを解析するためのREを使用する必要はありませんので。 xmllintの出力を解析するためにREを使用する必要があることを理解してください。 – badp
名前属性値の前に-------が表示されるのはなぜですか?どのようにそれを削除するには? –