2012-05-03 15 views
0

以下の構造の非常に大きな(10GB)xmlファイルはほとんどありません。ご覧のように、このファイルには一連のレコードが含まれています。私がしたいのは、1つまたは複数のプロパティに基づく検索レコードです。問題は、単純なgrepが私にプロパティを含む行を与えることです。たとえば、grepは私に100行、300行などを与えるかもしれません。しかし、私はマッチに合った行だけでなく、関連するレコード要素を抽出する機能が必要です。助けてくれるUNIXユーティリティがありますか?linuxのxmlファイル内で検索する

<records> 
<record seq="1"> 
    <properties> 
    <property name="AssetId">1234</property> 
    </properties> 
<message>messsage1</message> 
</record> 
<record seq="2"> 
<properties> 
    <property name="VI-ID">4567</property> 
</properties> 
<message>message2</message> 
</record> 
<records> 
+1

ここには多くのオプションがあります:http://stackoverflow.com/questions/91791/grep-and-sed-equivalent-for-xml-command-line-processingまた、xmllint(libxml2の一部)を見てください:http ://xmlsoft.org/xmllint.html – paulsm4

+0

抽出した情報はどうしますか? –

+0

この質問が前の質問に追加されている場合、入力テキストの例が示されています。これにより、提案されたツールの使用方法を示す具体的で目に見える提案を簡単に提供できます。 –

答えて

4

xmlstarletでは、シェルスクリプトからXPathを実行できます。これは完璧なユースケースです。例えば

xmlstarlet sel -t \ 
    -m '//record[properties/property[@name="AssetId"][text()="1234"]]' \ 
    -c . 

使用すると、1つのパス内で複数のマッチを行いたい場合は1234のAssetId性を有するレコード全体を印刷しますが、これはあまりにもサポートされています。

xmlstarlet sel \ 
    -t -m '//record[properties/property[@name="AssetId"][text()="1234"]]' \ 
    -c . -n -n \ 
    -t -m '//record[properties/property/@name="VI-ID"]' \ 
    -c . -n -n \ 
    <input.xml 

...このバージョンでは、AssetIDが1234のレコード、またはVI-IDのレコードに任意の値があり、eacの後に2つの改行を入れますhレコードが放出される。

0

おそらく最も簡単な方法は、grep-Cオプションを使用することです。各マッチの周りに指定された数の行が印刷されます。はい、レコードの境界線で正確に停止することはありませんが、通常はそれが含まれていることを保証するだけで十分です。

+0

OPが「抽出」と言ったときに、彼は実際にラインダンプだけでなく使用可能なデータが実際に必要なことを意味します。 –

0

あなただけの基本的なUNIXツールを使用したい場合は、ここでどちらか1行にあるプロパティを抽出することができます(愚かな)少しsedスクリプトだ、またはそれは複数行にまたがる:

sed -n ' 
/<open>[^<]*<\/open>/ { 
    p 
    b 
} 

/<open>/,/<\/open>/ { 
    p 
}' file.xml 

サンプルを入力:

​​

出力例:生産用まで

<open>stuff</open> 
<open> 
morestuff 
</open> 

ない:タグヘクタールであればこの方法はすぐに難しく、扱いにくくなり、xmlが十分に畳み込まれていれば不可能になります。しかし、それはここやそこに情報を解析するために行うべきです。

関連する問題