모든 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

관련 정보