2

次のような XML 構造があります。

<Tickets>
<EventsPoints>
      <Event ID="23">
           <PerformanceName>U2</PerformanceName>
           <EventDate>25/05/2012</EventDate>
           <EventPrice>75.00</EventPrice>
      </Event>
      <Event ID="27">
           <PerformanceName>Jedward</PerformanceName>
           <EventDate>28/05/2012</EventDate>
           <EventPrice>20.00</EventPrice>
      </Event>
            <Event ID="27">
           <PerformanceName>Rolling Stones</PerformanceName>
           <EventDate>03/12/2012</EventDate>
           <EventPrice>80.00</EventPrice>
      </Event>
</EventsPoints>
</Tickets>

基本的に、この XML で特定のパフォーマンス名 (「U2」など) を検索し、その XML ブロック全体を返します (つまり、そのパフォーマンス名、イベントの日付、および価格 - すべてフォーマットされた XML で、別の xml ファイルに保存されます)。

これは私のphpコードですが、データを正しく抽出していないようです:

$srcDom = new DOMDocument;
$srcDom->load('/var/www/html/xml/searchfile.xml');
$xPath = new DOMXPath($srcDom);


foreach ($srcDom->getElementsByTagName('Event') as $event) {

    $dstDom = new DOMDocument('1.0', 'utf-8');
    $dstDom->appendChild($dstDom->createElement('EventsPricePoints'));
    $dstDom->documentElement->appendChild($dstDom->importNode($event, true));

    $allEventsForVenue = $xPath->query(
        sprintf(
            '/Tickets/EventsPoints/Event/PerformanceName[.="U2"]'
        )
    );

    foreach ($allEventsForVenue as $event) {
        $dstDom->documentElement->appendChild($dstDom->importNode($event, true));
    }

    $dstDom->formatOutput = true;
    $dstDom->save(sprintf('/var/www/html/xml/searchresults1.xml'));
}
4

1 に答える 1

1

PerformanceName親要素が必要な場合、XPath は要素を取得します。に変更します

/Tickets/EventsPoints/Event/PerformanceName[.="U2"]/..

また

/Tickets/EventsPoints/Event[PerformanceName[.="U2"]]

またはインポート

$event->parentNode

また、最初のforeach. それを削除し$dstDom、XPath の結果を反復するコードに記述しているコードを移動します。http://codepad.org/zfOZXycZを参照してください

以下も参照してください。

于 2012-05-25T11:55:43.727 に答える