PHP Query XML with xPath


PHP Query XML with xPath

>我有一个如下所示的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'));
}

当您需要父元素时,XPath 会获取PerformanceName元素。将其更改为

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

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

或导入

$event->parentNode

另外,您不需要第一个foreach。删除它,并将写入$dstDom的代码移动到迭代 XPath 结果的代码中。见 http://codepad.org/zfOZXycZ

另请参阅:

  • DOMDocument in php 和
  • http://schlitt.info/opensource/blog/0704_xpath.html