我使用XPath查询一个xml文档,然后将找到的节点复制到一个单独的result xml文件中,但是我遇到的问题是,每次向结果文件中添加一个新节点时,都会添加顶部的XML声明。
这是我的php代码:
$allEventsForVenue = $xPath->query(
"/Ticket/EventsPoints/Event[contains(PerformanceName,'$searchParam')]"
);
foreach ($allEventsForVenue as $event) {
$dstDom = new DOMDocument('1.0', 'utf-8');
$dstDom->appendChild($dstDom->createElement('EventsPoints'));
$dstDom->documentElement->appendChild($dstDom->importNode($event, true));
//echo $dstDom->saveXml();
$dstDom->formatOutput = true;
$strxml .= $dstDom->saveXML();
$handle = fopen("/var/www/html/xml/searchresults$searchID.xml", "w");
fwrite($handle, $strxml);
fclose($handle);
} 无效的XML文件(一个文件中有两个xml声明):
->> <?xml version="1.0" encoding="utf-8"?>
<EventsPoints>
<Event ID="17">
<PerformanceName>Bressie</PerformanceName>
<PresaleTime/>
<PriceRange>17 - 17</PriceRange>
<VenueID ID="19"/>
</Event>
</EventsPoints>
->> <?xml version="1.0" encoding="utf-8"?>
<EventsPoints>
<Event ID="180">
<PerformanceName>U2</PerformanceName>
<PriceRange>20 - 20</PriceRange>
<VenueID ID="198"/>
</Event>
</EventsPoints>发布于 2012-05-31 18:02:39
您正在循环中创建新的DOMDocument实例。此外,您在每次迭代中都在编写代码。这就是在每次迭代中生成新的XML文档,并将其附加到xml文件中。您需要做的是,对XML生成部分进行循环。而不是整个。
如果您只循环appendChild部件,您的问题将会得到解决。
$dstDom = new DOMDocument('1.0', 'utf-8');
$dstDom->formatOutput = true;
foreach ($allEventsForVenue as $event) {
$dstDom->appendChild($dstDom->createElement('EventsPoints'));
$dstDom->documentElement->appendChild($dstDom->importNode($event, true));
}
file_put_contents("/var/www/html/xml/searchresults$searchID.xml", $dstDom->saveXML());发布于 2012-05-31 18:02:55
DomDocument允许您在不使用xml声明的情况下输出特定节点。
只需在saveXML中包含一个节点,比如saveXML($node),其中节点是一个XMLNode类型对象。
使用这种方法,我认为可以绕过整个"create sub-xmldocument/import node“,直接在字符串中输出所需的节点。
发布于 2012-05-31 18:05:08
使用像这样的东西
enter <?php
// Continued from example XML above.
/* Search for <a><b><c> */
$result = $xml->xpath('/a/b/c');
while(list( , $node) = each($result)) {
echo $node->asXML();
}
?>https://stackoverflow.com/questions/10831318
复制相似问题