我收到一个XML文件,该文件是从包含给定peiod的销售数据的业务会计应用程序导出的。
问题是,XML数据中有大量元素我不需要。我正在尝试只选择我需要的那个,并使用PHP将它们写入sperate XML文件,这样就可以在下一步中将它们上传到MySql。
我怎样才能挑选出我需要的元素?我已经尝试过使用PHP DOM getElementsByTagName
,但是无法想象如何一次性从XML文件中获取多个元素和所有元素。
sample XML file只是原始XML文件的一部分。原版运行到10K +行。
我只需要这些,并且所有这些都来自XML文件(有几个):
DATE
PARTYLEDGERNAME
LEDGERNAME
AMOUNT
STOCKITEMNAME
RATE
BILLEDQTY
AMOUNT
所以期望的输出如下所示:
<DATE>20180602</DATE>
<PARTYLEDGERNAME>ACME</PARTYLEDGERNAME>
<LEDGERNAME>CGST @ 9%</LEDGERNAME>
<AMOUNT>3.05</AMOUNT>
<LEDGERNAME>SGST @ 9%</LEDGERNAME>
<AMOUNT>3.05</AMOUNT>
<LEDGERNAME>CGST @ 2.5%</LEDGERNAME>
<AMOUNT>1.19</AMOUNT>
<LEDGERNAME>SGST @ 2.5%</LEDGERNAME>
<AMOUNT>1.19</AMOUNT>
<LEDGERNAME>NGST Sales</LEDGERNAME>
<AMOUNT>2998.82</AMOUNT>
<STOCKITEMNAME>Diesel</STOCKITEMNAME>
<RATE>69.74/Ltr</RATE>
<BILLEDQTY>43.000 Ltr</BILLEDQTY>
<AMOUNT>2998.82</AMOUNT>
<STOCKITEMNAME>Cleenol (500 ML)</STOCKITEMNAME>
<RATE>33.90/Pcs</RATE>
<BILLEDQTY>1 Pcs</BILLEDQTY>
<AMOUNT>33.90</AMOUNT>
<STOCKITEMNAME>Polishing Cloth</STOCKITEMNAME>
<RATE>23.80/Pcs</RATE>
<BILLEDQTY>2 Pcs</BILLEDQTY>
<AMOUNT>47.60</AMOUNT>
答案 0 :(得分:2)
使用PHP SimpleXML读取特定数据:
https://www.w3schools.com/php/php_xml_simplexml_get.asp
将这些数据写入新的XML文件之后:
$xml = new DOMDocument();
$xml_album = $xml->createElement("Album");
$xml_track = $xml->createElement("Track");
$xml_album->appendChild( $xml_track );
$xml->appendChild( $xml_album );
$xml->save("/tmp/test.xml");
&#13;
答案 1 :(得分:1)
由于您的输出结构是扁平的,您可以使用SimpleXML加载文件,然后只扫描结构,如果元素名称与您想要的字段列表匹配,则只需将它们添加到输出XML文档。
$file = "voucher.xml";
$in = simplexml_load_file($file);
$out = new SimpleXMLElement("<ENVELOPE />"); // You need a base element
$fields = ["DATE",
"PARTYLEDGERNAME",
"LEDGERNAME",
"AMOUNT",
"STOCKITEMNAME",
"RATE",
"BILLEDQTY",
"AMOUNT"];
function extractFields ( $in, $out, $fields ) {
foreach ( $in as $name => $element ) {
if ( in_array($name, $fields) ) {
$out->addChild($name, (string)$element);
}
if ( $element->count() > 0 ){
extractFields($element, $out, $fields);
}
}
}
extractFields( $in, $out, $fields );
echo $out->asXML();
对extractFields()
的递归调用允许代码重复遍历任何子数据并根据需要提取值。您可以将基本元素更改为您想要的任何内容,但XML需要它。
测试数据的输出是......
<?xml version="1.0"?>
<ENVELOPE>
<DATE>20180602</DATE>
<PARTYLEDGERNAME>ACME</PARTYLEDGERNAME>
<LEDGERNAME>ACME</LEDGERNAME>
<AMOUNT>-3088.80</AMOUNT>
<LEDGERNAME>CGST @ 9%</LEDGERNAME>
<AMOUNT>3.05</AMOUNT>
<LEDGERNAME>SGST @ 9%</LEDGERNAME>
<AMOUNT>3.05</AMOUNT>
<LEDGERNAME>CGST @ 2.5%</LEDGERNAME>
<AMOUNT>1.19</AMOUNT>
<LEDGERNAME>SGST @ 2.5%</LEDGERNAME>
<AMOUNT>1.19</AMOUNT>
<STOCKITEMNAME>Diesel</STOCKITEMNAME>
<RATE>69.74/Ltr</RATE>
<AMOUNT>2998.82</AMOUNT>
<BILLEDQTY> 43.000 Ltr</BILLEDQTY>
<AMOUNT>2998.82</AMOUNT>
<BILLEDQTY> 43.000 Ltr</BILLEDQTY>
<LEDGERNAME>NGST Sales</LEDGERNAME>
<AMOUNT>2998.82</AMOUNT>
<STOCKITEMNAME>Cleenol (500 ML)</STOCKITEMNAME>
<RATE>33.90/Pcs</RATE>
<AMOUNT>33.90</AMOUNT>
<BILLEDQTY> 1 Pcs</BILLEDQTY>
<AMOUNT>33.90</AMOUNT>
<BILLEDQTY> 1 Pcs</BILLEDQTY>
<LEDGERNAME>Sales @ 18%</LEDGERNAME>
<AMOUNT>33.90</AMOUNT>
<STOCKITEMNAME>Polishing Cloth</STOCKITEMNAME>
<RATE>23.80/Pcs</RATE>
<AMOUNT>47.60</AMOUNT>
<BILLEDQTY> 2 Pcs</BILLEDQTY>
<AMOUNT>47.60</AMOUNT>
<BILLEDQTY> 2 Pcs</BILLEDQTY>
<LEDGERNAME>Sales @ 5%</LEDGERNAME>
<AMOUNT>47.60</AMOUNT>
</ENVELOPE>