2012-05-31 71 views
0

我使用XPath查詢XML文檔,然後找到節點複製到一個單獨的結果xml文件,但是我遇到的問題是,在頂部的XML聲明被每一次新的節點加入添加到結果文件中。PHP的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> 
+0

- 反覆'fopen'和'fclose'會降低性能。 –

+0

謝謝,但有什麼辦法只運行這一行:$ dstDom = new DOMDocument('1.0','utf-8'); 曾經(在第一個循環) – user1417302

+0

檢查我的答案。我只創建了一次DOMDocument。並在其中重複添加元素,然後將其寫入文件。 –

回答

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()); 
1

DomDocument允許您輸出沒有xml聲明的特定節點。

只需包括在saveXML一個節點,就像saveXML($node),與節點是一個XMLNode類型對象。

使用這種方法,我認爲你可以繞過整個「創建子的XmlDocument /導入節點」的事情,在一個字符串直接輸出所需的節點。

+0

+1閱讀這個簡單的建議。 – hakre

+1

謝謝。請記住總是檢查PHP文檔,可能會忽略某些功能很容易找到:http://php.net/manual/en/domdocument.savexml.php – Cranio

+0

這是一個甜蜜的評論。如果可以的話,我會再次鼓掌;) – hakre

0

使用類似的`foreach`循環這個

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(); 
} 
?>