XML의 값을 구분된 파일로 인쇄하는 방법

XML의 값을 구분된 파일로 인쇄하는 방법

다음과 같이 줄 바꿈으로 구분된 두 개의 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 노드를 찾아 출력합니다.

관련 정보