すべてのXMLタグと値の抽出

すべてのXMLタグと値の抽出

私は次のような長い行を持っています:

<hdr><name><first>John</first><mid></mid><last>Smith</last></name><dob>04181995</dob><phone>5550001111<phone></hdr>

次のコンテンツをどのように抽出できますか?

<first>John</first>
<mid></mid>
<last>Smith</last>
<dob>04181995</dob>
<phone>5550001111<phone>

sedを試しましたが、追加のタグがあります。

echo "<hdr><name><first>John</first><mid></mid><last>Smith</last></name><dob>04181995</dob><phone>5550001111<phone></hdr>" | sed -e 's/></>\n</g'

<hdr>
<name>
<first>John</first>
<mid>
</mid>
<last>Smith</last>
</name>
<dob>04181995</dob>
<phone>5550001111<phone>
</hdr>

おそらくgrepがそれをすることができます。わかりません。助けてください

答え1

XMLパーサー(xmllintXPathなど)を使用して、必要なノードを参照して選択しようとしています。

echo "<hdr><name><first>John</first><mid></mid><last>Smith</last></name><dob>04181995</dob><phone>5550001111</phone></hdr>" \
| xmllint --xpath 'hdr/name/* | hdr/dob | hdr/phone' -

答え2

XMLパーサーを使用するxmlstarlet(壊れた閉じphoneたタグを修正した後):

$ xmlstarlet sel -t -m '/hdr' -c 'name/*' -c dob -c phone -nl file.xml
<first>John</first><mid/><last>Smith</last><dob>04181995</dob><phone>5550001111</phone>

まず/hdr、ノードを一致させ、次にノード()、つまり子ノードの-c各子ノードのコピーを選択します。その後、ノードのコピーも抽出されます。namefirstmidlastdobphone

関連情報