39

name の値を取得し、XMLLint を使用して変数に入れたい

<body>
<value name="abc"></value>
</body>

echo 'cat //body/value/@name' | xmllint --shell "test.xml"

/ >  -------
 name="abc"
/ > 

したがって、値「abc」を変数 $test に割り当てたい

4

5 に答える 5

44

引数の値を として返すfn:string()を使用する必要がありますxs:string。引数が属性の場合、属性の値を として返しますxs:string

test=$(xmllint --xpath "string(//body/value/@name)" test.xml)
于 2012-08-10T16:49:38.500 に答える
8

これを試してみてください。美しくはありませんが、機能します:)

>stdout からを含む行を消去し、文字列をカットして の後の 2 番目の部分を取得し、 ="

test=$(echo 'cat //body/value/@name' | xmllint --shell "test.xml" | grep -v ">" | cut -f 2 -d "=" | tr -d \"); 
echo $test
于 2012-07-27T08:28:22.670 に答える
5

複数の属性をサポートするヘルパー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
于 2017-05-27T18:00:15.480 に答える
4

最近、 --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 構成のビットを取得します)。

于 2014-06-05T03:23:23.867 に答える
0

複数の行を一致させ、それらの同名属性の値を抽出し、以前の回答に基づいて構築することを目標に、これは私にとってはうまくいきました。

xmllint --xpath "//*/@value" file.xml | awk -F\" '{ print $2 }'
于 2021-11-05T01:27:37.423 に答える