0

我正在使用 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>
4

3 回答 3

3

您正在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-31T10:02:38.807 回答
1

DomDocument允许您在没有 xml 声明的情况下输出特定节点。

只需在 saveXML 中包含一个节点,例如saveXML($node),节点是一个XMLNode类型对象。

使用这种方法,我认为您可以通过直接在字符串中输出所需的节点来绕过整个“创建子 xmldocument/导入节点”。

于 2012-05-31T10:02:55.360 回答
0

使用这样的东西

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();
 }
?>
于 2012-05-31T10:05:08.347 回答