XMLの値を区切りファイルとして印刷する方法

XMLの値を区切りファイルとして印刷する方法

次のように、改行で区切られた2つの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

おすすめ記事