1

XMLstarlet一部のデータを XML 形式から CSV に変換するために使用しようとしています。私のデータは次のようにフォーマットされています

<!-- mydata.xml -->
<alldata>
    <data id="first">
        <coord><x>0</x><y>5</y></coord>
        <coord><x>1</x><y>4</y></coord>
        <coord><x>2</x><y>3</y></coord>
    </data>
    <data id="second">
        <coord><x>3</x><y>2</y></coord>
        <coord><x>4</x><y>1</y></coord>
        <coord><x>5</x><y>0</y></coord>
    </data>
</alldata>

このデータを「id」、「x」、「y」の 3 つの列にフォーマットして取得したいと思います。

first;0;5
first;1;4
first;2;3
second;3;2
second;4;1
second;5;0

私の試みはXMLstarlet、私が何をしているのか本当に理解していないことを示して失敗しました。

xml sel -T -t -m /alldata/data -v "@id" -m /alldata/data/coord -v "concat(x,';',y)" -n mydata.xml

私に与えます:

first0;5
1;4
2;3
3;2
4;1
5;0
second0;5
1;4
2;3
3;2
4;1
5;0

これは私が望んでいるものでも期待しているものでもありません。クエリを変更して目的の出力を取得することはできますか?

4

1 に答える 1

2
-m /alldata/data -v "@id" -m /alldata/data/coord -v "concat(x,';',y)"

主な問題は、-m /alldata/data/coordこれはドキュメント全体のすべての要素に一致するcoordことです。あなたが本当に望んでいたのはcoord、現在のdata要素の下だけでした:

-m /alldata/data -v "@id" -m coord -v "concat(x,';',y)"

また、idすべての行に必要なので、内側のループに移動する必要があります。

-m /alldata/data -m coord -v "concat(../@id,';',x,';',y)"

この時点では、ネストされたループを 2 つ持つメリットはないため、単純化できます。

xml sel -T -t -m /alldata/data/coord -v "concat(../@id,';',x,';',y)" -n mydata.xml
于 2013-07-04T14:57:46.827 に答える