2009-07-20 82 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