使用PHP将子级附加到XML的特定位置的末尾 [英] Append Child to End of Specific Spot on XML using PHP
问题描述
我正在尝试将数据追加到下面的XML中特定位置的末尾。
I am trying to append data to the end of a specific place in the XML Below.
我的XML更长了,但是例如,我想将数据附加到标有删除的部分的末尾。然后,我将在总票数的末尾添加不同的数据,但是如果我能以某种方式找出如何将数据附加到第一个孩子的末尾,那么我就可以找出其余的数据。
My XML is a lot longer, but for instance, I want to append Data to the end of the section labeled "Delete". I would then be adding different data to the end of "Total Tickets", but if I can somehow figure out how to append data to the end of the first child, I can figure out the rest.
<report>
<sets>
<set>
<legend>Delete</legend>
<values>
<value date="2012-06-24" data="9"/>
<value date="2012-06-25" data="17"/>
<value date="2012-06-26" data="15"/>
<value date="2012-06-27" data="10"/>
<value date="2012-06-28" data="8"/>
</values>
</set>
<set>
<legend>Total Tickets</legend>
<values>
<value date="2012-06-24" data="412"/>
<value date="2012-06-25" data="416"/>
<value date="2012-06-26" data="423"/>
<value date="2012-06-27" data="405"/>
<value date="2012-06-28" data="280"/>
</values>
</set>
</sets>
</report>
下面是我编写的用于查看结果的测试脚本。在这种情况下,我试图在图例删除列表的末尾追加元素值和属性数据 12345
Below is a test script I wrote to see the results. In this instance, I am trying to append the Element 'value' with Attribute data of '12345' at the end of the list of the legend "Delete"
<?php
$doc = new DOMDocument;
$doc->load('result.xml');
$test = $doc->getElementsByTagName("legend")->item(0);
echo $test->nodeValue.PHP_EOL; //should print Delete
if("Delete" == $test->nodeValue)
{
$newElement = $doc->createElement('value');
$theAttribute = $doc->createAttribute('date');
$theAttribute->value='12345';
$newElement->appendChild($theAttribute);
$doc->appendChild($newElement);
}
echo $doc->saveXML();
?>
我得到的结果是:
<report>
<sets>
<set>
<legend>Delete</legend>
<values>
<value date="2012-06-24" data="9"/>
<value date="2012-06-25" data="17"/>
<value date="2012-06-26" data="15"/>
<value date="2012-06-27" data="10"/>
<value date="2012-06-28" data="8"/>
</values>
</set>
<set>
<legend>Total Tickets</legend>
<values>
<value date="2012-06-24" data="412"/>
<value date="2012-06-25" data="416"/>
<value date="2012-06-26" data="423"/>
<value date="2012-06-27" data="405"/>
<value date="2012-06-28" data="280"/>
</values>
</set>
</sets>
</report>
<value date="12345"/>
我正尝试获取如下所示的数据:
I'm trying to get the data shown as this instead:
<report>
<sets>
<set>
<legend>Delete</legend>
<values>
<value date="2012-06-24" data="9"/>
<value date="2012-06-25" data="17"/>
<value date="2012-06-26" data="15"/>
<value date="2012-06-27" data="10"/>
<value date="2012-06-28" data="8"/>
<value date="12345"/>
</values>
</set>
不确定如何将数据添加到该特定位置而不是最后
Not sure how I can get the data to be added to that specific spot instead of the very end of the XML.
我感谢任何人对此的帮助。
I appreciate anyones help with this.
推荐答案
尝试以下操作:
原始XML文件(另存为'testFile.xml'):
<?xml version="1.0" encoding="utf-8"?>
<report>
<sets>
<set>
<legend>Delete</legend>
<values>
<value date="2012-06-24" data="9"/>
<value date="2012-06-25" data="17"/>
<value date="2012-06-26" data="15"/>
<value date="2012-06-27" data="10"/>
<value date="2012-06-28" data="8"/>
</values>
</set>
<set>
<legend>Total Tickets</legend>
<values>
<value date="2012-06-24" data="412"/>
<value date="2012-06-25" data="416"/>
<value date="2012-06-26" data="423"/>
<value date="2012-06-27" data="405"/>
<value date="2012-06-28" data="280"/>
</values>
</set>
</sets>
</report>
PHP代码:
<?php
$dom = new DomDocument( '1.0' );
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
// load the xml file
$dom->load( 'testFile.xml', LIBXML_NOBLANKS );
$xpath = new DOMXPath($dom);
// prepare the xpath query to find the "values" node corresponding the
// "Delete" legend
$nodes = $xpath->query("//set[legend='Delete']/values");
// if found, append the new "value" node
if( $nodes->length ) {
$vNode = $dom->createElement( 'value' );
$vNodeAttr = $dom->createAttribute( 'date' );
$vNodeAttr->value = '12345';
$vNode->appendChild($vNodeAttr);
// append to "values"
$nodes->item(0)->appendChild( $vNode );
}
// i'm not saving it, just echo'ing
header( 'content-type: text/xml' );
echo $dom->saveXML();
?>
最终XML文件:
<?xml version="1.0" encoding="utf-8"?>
<report>
<sets>
<set>
<legend>Delete</legend>
<values>
<value date="2012-06-24" data="9"/>
<value date="2012-06-25" data="17"/>
<value date="2012-06-26" data="15"/>
<value date="2012-06-27" data="10"/>
<value date="2012-06-28" data="8"/>
<!--Node appended here-->
<value date="12345"/>
</values>
</set>
<set>
<legend>Total Tickets</legend>
<values>
<value date="2012-06-24" data="412"/>
<value date="2012-06-25" data="416"/>
<value date="2012-06-26" data="423"/>
<value date="2012-06-27" data="405"/>
<value date="2012-06-28" data="280"/>
</values>
</set>
</sets>
</report>
希望这会有所帮助。
这篇关于使用PHP将子级附加到XML的特定位置的末尾的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!