![XML의 값을 구분된 파일로 인쇄하는 방법](https://linux55.com/image/117691/XML%EC%9D%98%20%EA%B0%92%EC%9D%84%20%EA%B5%AC%EB%B6%84%EB%90%9C%20%ED%8C%8C%EC%9D%BC%EB%A1%9C%20%EC%9D%B8%EC%87%84%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
다음과 같이 줄 바꿈으로 구분된 두 개의 XML이 포함된 파일이 있습니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><ORDERS05><IDOC><EDI_DC40><TABNAM/><DOCNUM>123456</DOCNUM><DIRECT/><IDOCTYP/><STDMES>ORDRSP</STDMES><SNDPOR>SI_GIS-EDI</SNDPOR><SNDPRT>LS</SNDPRT><SNDPRN>0000929674</SNDPRN><RCVPOR>SAP_PI</RCVPOR><RCVPRN>SAP_PI</RCVPRN><CREDAT>20170905</CREDAT><CRETIM>105630</CRETIM><REFINT>17832651</REFINT><REFMES>1</REFMES></EDI_DC40></IDOC></ORDERS05>
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><ORDERS05><IDOC><EDI_DC40><TABNAM/><DOCNUM>12345</DOCNUM><DIRECT/><IDOCTYP/><STDMES>ORDRSP</STDMES><SNDPOR>SI_GIS-EDI</SNDPOR><SNDPRT>LS</SNDPRT><SNDPRN>0000929677</SNDPRN><RCVPOR>SAP_PI</RCVPOR><RCVPRN>SAP_PI</RCVPRN><CREDAT>20170905</CREDAT><CRETIM>105630</CRETIM><REFINT>17832651</REFINT><REFMES>1</REFMES></EDI_DC40></IDOC></ORDERS05>
이 태그에서 DOCNUM, MESTYP, SNDPRN 값을 추출하고 각 줄이 "XML"로 시작하는 쉼표로 구분된 파일로 저장하고 싶습니다. 태그가 누락된 경우(예: XML의 MESTYP) 쉼표로 대체됩니다. 내 출력은 다음과 같습니다.
XML,123456,,0000929674
XML,12345,,0000929677
다음 코드를 사용하여 DOCNUM 및 SNDPRN 값만 추출하려고 하면 제대로 작동합니다.
sed 's/.*<DOCNUM>\(.*\)<\/DOCNUM>.*<SNDPRN>\(.*\)<\/SNDPRN>.*/XML,\1,\2/' input.xml >> output.xml
그러나 MESTYP 태그가 input.xml 파일에 없기 때문에 다음 코드에서는 출력이 작동하지 않는 것 같습니다.
sed 's/.*<DOCNUM>\(.*\)<\/DOCNUM>.*<MESTYP>\(.*\)<\/MESTYP>.*<SNDPRN>\(.*\)<\/SNDPRN>.*/XML,\1,\2\3/' input.xml >> output.xml
위의 코드는 어떤 방식으로든 input.xml을 수정하지 않는 것으로 보입니다. 왜 그럴까요? 태그(예: MESTYP)가 누락된 경우 쉼표를 추가하도록 위 코드를 어떻게 변경할 수 있습니까?
참고: XMLlint와 같은 XML 유틸리티는 사용할 수 없습니다. 기존 코드를 수정하고 싶습니다. 감사해요!
답변1
이러한 유형의 데이터를 처리하는 데 적합한 도구인 XML/HTML 파서를 설치할 기회를 놓치지 마십시오.
현재로서는 이것은앗특정 상황에 대한 해결 방법:
awk -F'[<>]' '{ for(i=1;i<=NF;i++) { if($i~/DOCNUM|MESTYP|SNDPRN/) a[$i]=$(i+1) }
print "XML",a["DOCNUM"],a["MESTYP"],a["SNDPRN"] }' OFS=',' your.xml
산출:
XML,123456,,0000929674
XML,12345,,0000929677
답변2
while IFS= read -r xmldoc; do
printf '%s\n' "$xmldoc" |
xml sel -t -o 'XML,' \
-v '//DOCNUM' -o ',' \
-v '//MESTYPE' -o ',' \
-v '//SNDPRN' -nl
done <file.xml >output.txt
output.txt
이는 다음 과 같이 생성됩니다 .
XML,123456,,0000929674
XML,12345,,0000929677
입력 파일의 각 줄을 읽고 file.xml
다음으로 보냅니다.XML 스타처리를 위해. XMLStarlet 호출은 쉼표로 구분된 지정된 XML 노드를 찾아 출력합니다.