2012-07-23 73 views

答えて

8

これを試してみてください、それは美しいではないですが、それは動作します:)

私は、標準出力から>を含む行を消去=後の第二の部分を取得するには、文字列をカットし、

test=$(echo 'cat //body/value/@name' | xmllint --shell "test.xml" | grep -v ">" | cut -f 2 -d "=" | tr -d \"); 
echo $test 
」を削除します
+2

使用xmllintあなたはXMLを解析するためのREを使用する必要はありませんので。 xmllintの出力を解析するためにREを使用する必要があることを理解してください。 – badp

+0

名前属性値の前に-------が表示されるのはなぜですか?どのようにそれを削除するには? –

23

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

test=$(xmllint --xpath "string(//body/value/@name)" test.xml) 
+8

残念なことに--xpathは多くのインストールでサポートされていません – Fergie

+0

http://stackoverflow.com/questions/11975862/xmllint-unknown-option-xpath – Dejan

+5

これは単一の要素の値のみを表示します。複数の一致を得ることが可能です? –

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' 
} 

$ getxml /tmp/test.xml "//server[@node-ref]/@name" 
inst1 
inst2 

sedの後処理がちょうど(GlassFishの設定のビットを取得)私のニーズに十分であったすべての引用された値をつかむ:GlassFishのドメイン設定からインスタンス名を抽出します。

3

複数の属性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 
+0

これは私のために完璧に動作します、ありがとう。あなたはまた、異なる変数に値を割り当てる良い方法がありますか? VAR_1 = $(echo 'cat // */@ name' | xmllint - シェルファイル| awk -F \ "'NR%2 == 0 {print $ 2}')? – dieHellste

+0

@dieHellste:' read'出力行を変数に( 'while'ループで、' Bashで 'read-a'で配列に)追加のガイダンスが必要な場合は、新しい質問をしてください。 – mklement0

関連する問題