2009-07-16 11 views
1

シェルを使用してウィジェットconfig.xmlから値を解析しようとしています。私はこの仕事のためにsedを使いたいと思う。 xsltprocよりもsucks lessのものがあれば、私は知りたいです。私はこの例ではシェル内のXMLから属性にアクセスする

以下​​3210からID属性値の後に:

<?xml version="1.0" encoding="UTF-8"?> 
<widget xmlns="http://www.w3.org/ns/widgets" id="http://example.org/exampleWidget" version="2.0 Beta" height="200" width="200"> 
<name short="123">Foo Widget</name> 
</widget> 

私はそれがJquery's attrのと同じくらい簡単だった希望:var id = $("widget").attr("id");

現在xsltprocを利用し、このシェルコードは失敗します。

snag() { 
TMP=$(tempfile) 
cat <<EOF> $TMP 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="text" encoding="utf-8" indent="no"/> 
<xsl:template> 
<xsl:value-of select="$1"/> 
</xsl:template> 
</xsl:stylesheet> 
EOF 

echo $(xsltproc $TMP config.xml) 
rm -f $TMP 
} 

ID=$(snag "widget/@id") 

if test "$ID" = "http://example.org/exampleWidget" 
then 
    echo Mission accomplished. 
else 
    echo "<$ID> is wrong." 
fi 

答えて

1

XMLStarlet(http://xmlstar.sourceforge.net/)は、このようなクエリをサポートしている素敵なコマンドラインツールでありますsel -N w =ネームスペース-T -t -m "/ w:ウィジェット/ @ id" -v。 -n config.xml

+0

/解析できないあなたは、このコマンドを試したことがありますか? 1.0.1では動作しません。 – hendry

+0

私は最初の試行でウィジェットの名前空間を忘れました。あなたは '名前空間'をXMLの値で置き換えなければなりません、Stackoverflowは新しいユーザーが複数のURLを貼り付けることはできません。 –

+0

どのように素晴らしい、それは動作します。 'hendry @ x61シェル$ xmlstarlet sel -N w =" http://www.w3.org/ns/widgets "-T -t -m"/w:widget/@ id "-v。 -n config.xml http:// webvm.net/widgets/123' しかし、そこにスイッチのaboniationがあります。無邪気な!! – hendry

0

テンプレートm ATCH =

を "ウィジェット" を選択価値の= "@ ID" が

0

<のxsl:テンプレートのxmlns:WGT = "http://www.w3.org/ns/widgets" 一致= "/ WGT :ウィジェット "> <のxsl:選択値-の=" @ ID」/> </XSL:

xmlstarlet:テンプレート>

+0

hendry @ x61シェル$ sh foo。3: \tを/ tmp/file3jey7M SHパーサーエラー:属性値-の \tのための仕様の任務値ます。 \t \t \t \t \t \t^ \t/tmpに/ file3jey7M:3:パーサーエラー:属性がエラー構築 \tます。 \t \t \t \t \t \t^ \tを/ tmp/file3jey7M:3:パーサーエラー:Couldn」 t開始タグ選択lの終わりを見つけるINE 3 \tます。 \t \t \t \t \t \t^ \tは/ tmp file3jey7M – hendry

0

変換を行っていない場合は、XSLTは必要ありません。 値を取得する必要がある場合は、XPathを使用します。

PerlのXML :: XPathモジュールに付属するxpathプログラムがあります。シェルから

: ID = $(のXPathのconfig.xml 'の文字列(/ウィジェット/ @のID)')

(文字列()関数は、IDの値だけを取得することです

。それ自体で

/ウィジェット/ @ idが「ID =値」を返す)

あなただけの値に応じていくつかの他の出力を生成する必要がある場合は、XSLTでそれをすべて 行うことができます。 他のスクリプト言語から利用可能な他のXPath実装もあります。私はrhinoとJythonの両方からJavaのXPathを使用しました。 SaxonのコマンドラインからのXQueryもあります。

+0

Xpathは 'xmlstarlet'に比べて本当に重く見えます。 – hendry

関連する問題