【问题标题】:PHP Query XML with xPathPHP 使用 xPath 查询 XML
【发布时间】:2012-05-25 11:51:17
【问题描述】:

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

【问题讨论】:

    标签: php xml xpath


    【解决方案1】:

    当您需要父元素时,您的 XPath 会获取 PerformanceName 元素。改成

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

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

    或导入

    $event->parentNode
    

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

    另见:

    【讨论】:

    • 思路是搜索表演名称,然后返回活动详情
    • 感谢成功,唯一的问题是,如果有两个具有相同表演名称的事件,它只返回第一个
    • @user 我很确定你会弄清楚如何使用给定的信息来改变它。您也必须找到一些东西;)
    猜你喜欢
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多