【发布时间】:2019-11-12 12:04:31
【问题描述】:
我每天都会收到一个 .xml 文件,但需要对元素值进行一些额外的编辑。我已经通过数据透视表在 Excel 中完成了我需要的工作,但该解决方案是不可接受的,因为这会创建新结构并且我无法将其保存为 xml,并且我需要相同的 xml 结构作为输出。由于我安装了 PHP Composer,我认为 simpleXML 库是最简单的解决方案。上传原始 .xml 文件并通过 simplexml_load_string 函数完成修改。问题是,我对那种语法不是很精通,我需要一些帮助。这是我的 .xml 文件:
<?xml version="1.0" encoding="ISO-8859-2"?>
<ZCOLL>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<DOCNUM>0000000008857855</DOCNUM>
<SERIAL>20191025143123</SERIAL>
</EDI_DC40>
<Z1COLL_AGENCY SEGMENT="1">
<GPART>0000000101</GPART>
<EMAIL>domain@domain.com</EMAIL>
<Z1COLL_HEADER SEGMENT="1">
<VKONT>200000541301</VKONT>
<GPART>1000447089</GPART>
<VKONA>22611402001</VKONA>
<INKNO>00000000000101953558</INKNO>
<INKBP>0000000101</INKBP>
<INKDAT>20191025</INKDAT>
<INKENDAT>20200123</INKENDAT>
<BANKRUPTDAT>00000000</BANKRUPTDAT>
<CLOSED/>
<UPDATED_DATE>00000000</UPDATED_DATE>
<COLLREFNR>200005413019-024-6</COLLREFNR>
<NAME_ORG1>SOME OTHER NAME</NAME_ORG1>
<LEG_CITY1>SOME OTHER CITY</LEG_CITY1>
<LEG_POST_CODE1>105677</LEG_POST_CODE1>
<LEG_STREET>ADDRESS 2</LEG_STREET>
<LEG_HOUSE_NUM1/>
<BU_SORT2>02226696981</BU_SORT2>
<MAIL_CITY1>CITY 1</MAIL_CITY1>
<MAIL_POST_CODE1>35220</MAIL_POST_CODE1>
<MAIL_STREET>MAIL STREET 1</MAIL_STREET>
<MAIL_HOUSE_NUM1/>
<Z1COLL_ITEM SEGMENT="1">
<OPBEL>000210625857</OPBEL>
<XBLNR>0000198653579124</XBLNR>
<FAEDN>20190916</FAEDN>
<AGDAT>20191025</AGDAT>
<INITAMNT> 80.00</INITAMNT>
<PAYAMNT> 0.00</PAYAMNT>
<WRTOFFAMNT> 0.00</WRTOFFAMNT>
<OPENAMNT> 80.00</OPENAMNT>
<INVAMNT> 80.00</INVAMNT>
<WAERS>HRK</WAERS>
<RECINKDAT>00000000</RECINKDAT>
</Z1COLL_ITEM>
<Z1COLL_ITEM SEGMENT="1">
<OPBEL>000210625857</OPBEL>
<XBLNR>0000198653579124</XBLNR>
<FAEDN>20191016</FAEDN>
<AGDAT>20191025</AGDAT>
<INITAMNT> 80.00</INITAMNT>
<PAYAMNT> 0.00</PAYAMNT>
<WRTOFFAMNT> 0.00</WRTOFFAMNT>
<OPENAMNT> 80.00</OPENAMNT>
<INVAMNT> 80.00</INVAMNT>
<WAERS>HRK</WAERS>
<RECINKDAT>00000000</RECINKDAT>
</Z1COLL_ITEM>
<Z1COLL_ITEM SEGMENT="1">
<OPBEL>019183828875</OPBEL>
<XBLNR>2261140200119081</XBLNR>
<FAEDN>20190816</FAEDN>
<AGDAT>20191025</AGDAT>
<INITAMNT> 159.00</INITAMNT>
<PAYAMNT> 0.00</PAYAMNT>
<WRTOFFAMNT> 0.00</WRTOFFAMNT>
<OPENAMNT> 159.00</OPENAMNT>
<INVAMNT> 159.00</INVAMNT>
<WAERS>CURRENCY</WAERS>
<RECINKDAT>00000000</RECINKDAT>
</Z1COLL_ITEM>
<MSISDNS>
<MSISDN>381653490012</MSISDN>
</MSISDNS>
<MCD_DATA>
<MCD_MONTHS/>
<MCD_AMOUNT/>
</MCD_DATA>
<PHONE_NUM/>
</Z1COLL_HEADER>
</Z1COLL_AGENCY>
</IDOC>
</ZCOLL>
我需要的是,如果 OPBEL 和 XBLNR 元素值相同,则删除该节点并将其替换为 OPBEL 和 XBLNR 的单个重复值以及 INITAMNT、PAYAMNT、WRTOFFAMNT、OPENAMNT 和 INVAMNT 的汇总值,并返回 .xml具有相同结构的文件。
这是我的代码,我卡到一半了:
if (isset($_POST['submit'])) {
//echo "<pre>";
//print_r($_FILES['file']['name']);
//echo "</pre>";
if(isset($_FILES['file']['name'])) {
$get = file_get_contents($_FILES['file']['tmp_name']);
$arr = simplexml_load_string($get);
foreach ($arr->IDOC->Z1COLL_AGENCY->Z1COLL_HEADER as $element) {
$delete_node = array();
foreach($element->Z1COLL_ITEM as $item) {
$doubles_XBLNR = array_count_values($item->XBLNR);
$doubles_OPBEL = array_count_values($item->OPBEL);
$doubles_no_XBLNR = count($doubles_XBLNR);
$doubles_no_OPBEL = count($doubles_OPBEL);
if (($doubles_no_XBLNR > 2) && ($doubles_no_OPBEL > 2)){
$item->INITAMNT += $item->INITAMNT;
$item->PAYAMNT += $item->PAYAMNT;
$item->WRTOFFAMNT += $item->WRTOFFAMNT;
$$item->OPENAMNT += $item->OPENAMNT;
$item->INVAMNT += $item->INVAMNT;
}
}
echo "<br />";
}
这是所需的 xml 输出:
<?xml version="1.0" encoding="ISO-8859-2"?>
<ZCOLL>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<DOCNUM>0000000008857855</DOCNUM>
<SERIAL>20191025143123</SERIAL>
</EDI_DC40>
<Z1COLL_AGENCY SEGMENT="1">
<GPART>0000000101</GPART>
<EMAIL>domain@domain.com</EMAIL>
<Z1COLL_HEADER SEGMENT="1">
<VKONT>200000541301</VKONT>
<GPART>1000447089</GPART>
<VKONA>22611402001</VKONA>
<INKNO>00000000000101953558</INKNO>
<INKBP>0000000101</INKBP>
<INKDAT>20191025</INKDAT>
<INKENDAT>20200123</INKENDAT>
<BANKRUPTDAT>00000000</BANKRUPTDAT>
<CLOSED/>
<UPDATED_DATE>00000000</UPDATED_DATE>
<COLLREFNR>200005413019-024-6</COLLREFNR>
<NAME_ORG1>SOME OTHER NAME</NAME_ORG1>
<LEG_CITY1>SOME OTHER CITY</LEG_CITY1>
<LEG_POST_CODE1>105677</LEG_POST_CODE1>
<LEG_STREET>ADDRESS 2</LEG_STREET>
<LEG_HOUSE_NUM1/>
<BU_SORT2>02226696981</BU_SORT2>
<MAIL_CITY1>CITY 1</MAIL_CITY1>
<MAIL_POST_CODE1>35220</MAIL_POST_CODE1>
<MAIL_STREET>MAIL STREET 1</MAIL_STREET>
<MAIL_HOUSE_NUM1/>
<Z1COLL_ITEM SEGMENT="1">
<OPBEL>000210625857</OPBEL>
<XBLNR>0000198653579124</XBLNR>
<FAEDN>20190916</FAEDN>
<AGDAT>20191025</AGDAT>
<INITAMNT> 160.00</INITAMNT>
<PAYAMNT> 0.00</PAYAMNT>
<WRTOFFAMNT> 0.00</WRTOFFAMNT>
<OPENAMNT> 160.00</OPENAMNT>
<INVAMNT> 160.00</INVAMNT>
<WAERS>CURRENCY</WAERS>
<RECINKDAT>00000000</RECINKDAT>
</Z1COLL_ITEM>
<Z1COLL_ITEM SEGMENT="1">
<OPBEL>019183828875</OPBEL>
<XBLNR>2261140200119081</XBLNR>
<FAEDN>20190816</FAEDN>
<AGDAT>20191025</AGDAT>
<INITAMNT> 159.00</INITAMNT>
<PAYAMNT> 0.00</PAYAMNT>
<WRTOFFAMNT> 0.00</WRTOFFAMNT>
<OPENAMNT> 159.00</OPENAMNT>
<INVAMNT> 159.00</INVAMNT>
<WAERS>CURRENCY</WAERS>
<RECINKDAT>00000000</RECINKDAT>
</Z1COLL_ITEM>
<MSISDNS>
<MSISDN>381653490012</MSISDN>
</MSISDNS>
<MCD_DATA>
<MCD_MONTHS/>
<MCD_AMOUNT/>
</MCD_DATA>
<PHONE_NUM/>
</Z1COLL_HEADER>
</Z1COLL_AGENCY>
</IDOC>
</ZCOLL>
感谢任何帮助。谢谢。
【问题讨论】: