PHP将XML文件中的多个元素复制到另一个XML文件中

时间:2018-06-16 05:32:05

标签: php xml dom

我收到一个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>

2 个答案:

答案 0 :(得分:2)

使用PHP SimpleXML读取特定数据:

https://www.w3schools.com/php/php_xml_simplexml_get.asp

将这些数据写入新的XML文件之后:

&#13;
&#13;
$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;
&#13;
&#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>