如何将 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

但是,我猜因为 input.xml 文件中缺少 MESTYP 标记,因此输出似乎不适用于以下代码:

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针对您的特定情况的解决方法:

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 节点(中间用逗号分隔)。

相关内容