Получить элемент из массива с помощью xpath - PullRequest
0 голосов
/ 26 сентября 2011

У меня есть следующий объект SimpleXML:

SimpleXMLElement Object
(
[@attributes] => Array
    (
        [status] => ok
    )

[a] => SimpleXMLElement Object
    (
        [b] => Array
            (
                [0] => SimpleXMLElement Object
                    (
                        [c] => Google
                        [d] => GOOG
                        [e] => http://www.google.com
                    )

                [1] => SimpleXMLElement Object
                    (
                        [c] => Yahoo
                        [d] => YHOO
                        [e] => http://www.yahoo.com
                    )

                [2] => SimpleXMLElement Object
                    (
                        [c] => Microsoft
                        [d] => MSFT
                        [e] => http://www.microsoft.com
                    )

Учитывая d Я хочу получить e - Поскольку b является массивом, есть ли способ сделать это без циклического прохождения по всему массиву?

<stk status="ok">
<a>
  <b>
    <c>Yahoo</c>
    <d>YHOO</d>
    <e>http://www.yahoo.com</e>
  </b>

  <b>
    <c>Google</c>
    <d>GOOG</d>
    <e>http://www.google.com</e>
  </b>

  <b>
    <c>Microsoft</c>
    <d>MSFT</d>
    <e>http://www.microsoft.com</e>
  </b>
</a>
</stk>

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Вы можете использовать запрос XPath, запрашивающий элементы e, являющиеся дочерними элементами элементов b, имеющих элементы d с текстом YHOO.

Помните, что SimpleXMLElement::xpath() вернет массив элементов, даже если XPath найдет только один: следовательно, $urls[0], чтобы получить первый (единственный) элемент.

$xml  = '<stk status="ok"><a><b><c>Yahoo</c><d>YHOO</d><e>http://www.yahoo.com</e></b><b><c>Google</c><d>GOOG</d><e>http://www.google.com</e></b><b><c>Microsoft</c><d>MSFT</d><e>http://www.microsoft.com</e></b></a></stk>';
$stk  = simplexml_load_string($xml);
$urls = $stk->xpath('/stk/a/b[d="YHOO"]/e');
$yhoo = (string) $urls[0];
echo $yhoo;
0 голосов
/ 27 сентября 2011

Итерация по всем //d.

Для каждого оцените following-sibling::e[1].

Я думаю, что это имел в виду Марк Б.

...