代码之家  ›  专栏  ›  技术社区  ›  Warrior

使用xpath和xquery分析XML文件

  •  0
  • Warrior  · 技术社区  · 16 年前

    我有一个XML文件

    <?xml version="1.0" encoding="UTF-8"?>
    <xml>
    <settings>
    <title>Calendar for September</title>
    <subTitle>Calendar for September  Calendar for September</subTitle>
    </settings>
    <events date="06-09-2010">
    <event id="2">
    <title>This is My Second Event</title>
    <description>This is My Second Event </description>
    </event>
    <event id="3"><title>This is My Third  Event </title><description>This is My Third  Event This is My Third  Event This is My Third  Event </description></event></events>
    </xml>
    

    我正在分析XML文件,使用

    $xml_str = file_get_contents('xmlfile');
    $xml = simplexml_load_string($xml_str);
    if(!empty($xml))
    {
     $nodes = $xml->xpath('//xml/events/event[@id="'.$id.'"]');
    }
    

    它只提供具有指定ID的事件标记的标题和描述。如何获取日期

    2 回复  |  直到 16 年前
        1
  •  1
  •   kennytm    16 年前

    尝试

    //event[@id="2"]/parent::events/@date
    

    加上最初的xpath:

    //event[@id="2"]/parent::events/@date | //event[@id="2"]
    
        2
  •  0
  •   VolkerK    16 年前

    一旦你找到了 <event> 元素将其用作获取最近的XPath查询的上下文节点 <events> 元素在 ancestor 轴。

    $id = 2;
    $xml = simplexml_load_file('xmlfile');
    if( !$xml ) {
      echo '!xml doc';
    }
    else if ( !($event=$xml->xpath('events/event[@id="'.$id.'"]')) ) {
      echo '!event[id=...';
    }
    else if ( !($container = $event[0]->xpath('ancestor::events[1]')) ) {
      echo '!events parent';
    }
    else {
      echo $container[0]['date'], ' - ', $event[0]->title, "\n";
    }