>我正在使用XPath查询xml文档,然后将找到的节点复制到单独的结果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>
您正在循环中创建新的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());
DomDocument
允许您输出没有 xml 声明的特定节点。
只需在 saveXML 中包含一个节点,如 saveXML($node)
,节点是XMLNode
类型对象。
使用这种方法,我认为您可以通过直接在字符串中输出所需的节点来绕过整个"创建子 xmldocument/import 节点"的事情。
使用类似的东西
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();
}
?>