提取所有 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该节点的每个子节点的副本( )name,即 、firstmidlast子节点。然后它还提取dob和节点的副本phone

相关内容