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 ファイルが無効です (1 つのファイルに 2 つの 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

DomDocumentxml 宣言なしで特定のノードを出力できます。

saveXML($node)のように、ノードがXMLNode型オブジェクトであるsaveXML にノードを含めるだけです。

この方法を使用すると、目的のノードを文字列で直接出力することにより、「サブxmlドキュメントの作成/ノードのインポート」全体をバイパスできると思います。

于 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 に答える