Как выбрать все родительские элементы на основе атрибута данного узла в xPath php? - PullRequest
0 голосов
/ 15 апреля 2010

Благодаря AakashM он привел меня в правильном направлении. Для вопроса ниже, это выражение xPath, которое привело меня правильно:

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

Оригинальный пост:

У меня есть лента XML, которая выглядит примерно так (отрывок):

<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-узлы (с их дочерними элементами) на основе этого надоедливого атрибута «domain» в узле категории, но независимо от того, что я пытаюсь сделать, это не работает .

Самым близким, что я получил, было "// 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 Ответ

1 голос
/ 15 апреля 2010

(попробуйте и не используйте //, когда вы точно знаете структуру вашего xml)

Таким образом, вы хотите, чтобы все item узлы имели дочерний узел category, который в свою очередь имеет атрибут domain с определенным значением:

/channel/item[category[@domain='http://www.somelink.com/?category=4']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...