11


4

UNIX端末を使用してXMLを解析する

時には、XMLファイルから任意のデータを素早く抽出してCSV形式にする必要があります。 Unix端末でこれを行うためのあなたのベストプラクティスは何ですか? 私はいくつかのコード例が大好きです、例えば、どうすれば次の問題を解決することができますか?

XML入力の例:


私の希望するCSV出力:

Foo,
Bar,

7 Answer


11


https://stackoverflow.com/questions/29004/parsing-xml-using-unix-terminal#29023[Peter's answer]は正しいのですが、末尾の改行を出力します。

実行するだけです。

xsltproc stylesheet.xsl source.xml

CSV結果を標準出力に生成します。


9


xsltproc、http://saxon.sourceforge.net/[saxon]、http://xalan.apache.org/などのコマンドラインXSLTプロセッサを使用してください。 [xalan]はXMLを解析してCSVを生成します。 これがhttp://www.stylusstudio.com/xmldev/200404/post60210.html [例]です。あなたの場合はこれがスタイルシートです:



6


XMLStarletは、XML文書を照会/編集/確認/変換するためのコマンドライン・ツールキットです(詳細については、http://xmlstar.sourceforge.net/を参照してください)。

書き込むファイルはありません。ファイルをxmlstarletにパイプ処理してxpathフィルタを適用するだけです。

cat file.xml | xml sel -t -m 'xpathExpression' -v 'elemName' 'リテラル' -v 'elname' -n -m式-v value ''組み込みリテラル-n改行

そのため、あなたのxpathではxpath式は// myel / @ nameとなり、2つの属性値が与えられます。

とても便利な道具です。

HTH


5


あなたが単に任意の要素の名前属性が欲しいならば、これは迅速であるが不完全な解決策です。

(あなたの例のテキストは_example_ファイルにあります)

_ grep "name"の例| cut -d "\" "-f2,2 | xargs -I \ {} echo" \ {}、 " _


2


これはあなたの質問が正確に行うものです( 'myel’という要素から 'name’という属性を引き出します)。 一般化するのは簡単なはずです

#!/ usr / bin / ruby​​ -w

'rexml / document'が必要です

xml = REXML :: Document.new(File.open(ARGV [0] .to_s))xml.elements.each( "// myel"){| el | {}} el.attributes ['name']}の場合、 "#{el.attributes ['name']}"を出力します。


2


xmlファイルが "test.xml"であると想定して、元の質問に答えます。

` `

cat text.xml | tr -s "\"" " " | awk '{printf "%s,\n", $3}'


1


テストファイルはtest.xmlにあります。

sed -nの/ ^ \ s` * `<myel \ s` *` name = "\([^"] `*` \) "。` * `$ / \ 1、/ p 'test.xml

たとえば、各* myel が1行にあることが厳密に指定されていない場合は、最初にxmlファイルを「正規化」する必要があります(したがって、各 myel *は1行になります)。