SimpleXML, ассоциативные массивы и XPath - PullRequest
0 голосов
/ 20 июля 2009

У меня есть вопрос о xpath и массивах. Мне было интересно, возможно ли использовать xpath для некоторого simpleXML и вернуть ему ассоциативный массив имен узлов и их значений. Например, скажем, у меня есть следующий XML:

<element1 page="1">blah</element1>
<element2 page="1">blah blah</element2>
<element3 page="2">blah</element3>
<element4 page="3">blah blah</element4>

Теперь, если бы я пошел $xml->xpath('//node()[@page="1"]');, он бы возвратил массив, подобный следующему:

array( 0 => 'blah' , 1 => 'blah blah' );

Можно ли получить массив, аналогичный приведенному ниже?

array( element1 => 'blah' , element2 => 'blah blah' );

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 13 августа 2009

Для простого XML массив не совсем такой, как вы упомянули, он больше похож на:

$result = array( 0 => simplexmlObject('blah') , 1 => simplexmlObject('blah blah') );

поскольку у вас есть объект SimpleXML, а не литеральная строка, у вас все еще есть доступ к полному документу SimpleXML:

$result[0]->addChild("another", "child");

// which is <element1 page="1">blah<another>child</another></element1>

или ближе к вашему вопросу

$name = $result[0]->getName();

и если вы поражены всем, что вы можете сделать со свойствами DOM, тогда вы можете сделать что-то вроде:

$parent = dom_import_simplexml($result[0])->parent; 
1 голос
/ 20 июля 2009

Я не думаю, что вы можете извлечь это в массив такого типа (вам нужно указать PHP, какие теги, дочерние узлы, атрибуты и т. Д. Поместить туда), но вы можете извлечь элементы DOMNode, используя DOMXPath класс , который дает вам DOMNodeList объект:

$document = new DOMDocument();
$document->load($myXmlFile);
$xpath = new DOMXPath($document);

$result = $xpath->query('//node()[@page="1"]');
var_dump($result->length); // int(2)
var_dump($result->item(0)->tagName); // string(8) "element1"
var_dump($result->item(1)->tagName); // string(8) "element2"
...