2009-07-20 48 views
0

我有一个关于xpath和数组的问题。我想知道的是,是否有可能在某些simpleXML上使用xpath,并让它返回节点名称及其值的关联数组。例如,假设我有以下XML:SimpleXML,关联数组和XPath

<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'); 

感谢您的帮助!

回答

1

我不认为你可以获取那种数组(你需要告诉PHP什么标签,子节点,属性等放在那里),但你可以使用DOMXPath class获取DOMNode元素,这给你一个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" 
1

对于简单的XML数组不完全是你提到它更像是:

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

,因为你有一个SimpleXML的对象,而不是一个字符串你仍然可以访问到完整的SimpleXML d ocument:

$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; 
+0

谢谢为了这;我宁愿循环使用`$ result [0] - > getName()`来自己生成所需的数组,而不是按照其他建议重构我的依赖项。 – JMTyler 2014-03-11 17:18:11