如何根据php的xPath中给定节点的属性选择所有父项?

时间:2010-04-15 17:34:40

标签: php xpath design-patterns

感谢AakashM,他带领我朝着正确的方向前进。对于下面的问题,这是以正确的方式引导我的xPath表达式:

"//channel/item[category[@domain='http://www.somelink.com/?category=4']]"

原帖:

我有一个类似于此的XML Feed(摘录):

<channel>
  <title>Channel Name</title>
  <link>Link to the channel</link>

    <item>
      <title>Heading 1</title>
      <link>http://www.somelink.com?id=100</link>
      <description><![CDATA[ Text here ]]></description>
      <publishDate>Fri, 03 Apr 2009 10:00:00</publishDate>
      <guid>http://www.somelink.com/read-story-100</guid>
      <category domain="http://www.somelink.com/?category=4">Category 1</category>
    </item>

    <item>
      <title>Heading 2</title>
      <link>http://www.somelink.com?id=110</link>
      <description><![CDATA[ Text here ]]></description>
      <publishDate>Fri, 03 Apr 2009 11:00:00</publishDate>
      <guid>http://www.somelink.com/read-story-110</guid>
      <category domain="http://www.somelink.com/?category=4">Category 1</category>
    </item>

  <channel>

这就是它的粗糙。我正在使用这段PHP(摘录):

$xml = simple_xml_load_file($xmlFile);
$xml->xpath($pattern);

现在我想基于类别节点中那个讨厌的“域”属性来获取所有ITEM节点(及其子节点),但无论我尝试它做什么 - 不工作

我最接近的是“// category [@ domain ='http://www.somelink.com/?category=4']”

我试过的表情给了我这个结果:

 [0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [domain] => http://www.somelink.com/?category=4
                )

            [0] => Category 1

 [1] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [domain] => http://www.somelink.com/?category=4
                )

            [0] => Category 1

表达式应包含示例中两个项目的所有子项,但正如您所看到的,只有类别节点中的信息存在,我想要所有项目节点。

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

(当您确定xml的结构时,请尝试并避免使用//

所以你希望所有item个节点都有一个category子节点,而这个节点又有一个具有特定值的domain属性:

/channel/item[category[@domain='http://www.somelink.com/?category=4']]