2013-01-09 105 views
0

我想選擇一個特定的節點來稍後編輯它的內容和屬性,但我無法選擇一個notice節點(請參閱下面的PHP代碼)。在DomXML和PHP中通過屬性值獲取節點

XML文檔

<?xml version="1.0" encoding="UTF-8"?> 
<notices lastID="0001"> 
    <!-- 
    <notice id="0000" endDate="31-12-2025"> 
     Content of the notice. 
    </notice> 
    --> 
    <notice id="0001" endDate="13-01-2013" active="1"> 
     One amazing notice. 
    </notice> 

</notices> 

$id值是 「0001」()。

PHP

$document = new DOMDocument; 
$document = dom_import_simplexml($this->xml); 

$notices= $document->getElementsByTagName('notice'); 
#var_dump($notices); 

foreach($notices as $element) 
{ 
    if($element->getAttribute('id') == $id) 
    { 
     $notice = $element; 
     var_dump($notice); //Returns absolutely nothing (I guess the if returns false). 
    } 
} 

$notice->removeAttribute("endDate"); 
$notice->setAttribute("endDate",$endDate); 

每次我陷入if聲明,我$notice無返回值。
我試着用xpath查詢(//notice[@id="{$id}"])沒有任何成功。

爲了澄清,我的問題將是$element->getAttribute('id')似乎並不奏效。


我也試圖與的SimpleXML

PHP

$document = new DOMDocument; 
$document = simplexml_import_dom($this->xml); 

$notice = ""; 

foreach($document->notices->children() as $element) 
{ 
    $attributes = $element->attributes(); 
    if($attributes['id'] == $id) 
    { 
     $notice= $element; 
     var_dump($notice); 
    } 
} 
$avis->removeAttribute("endDate"); 
$avis->setAttribute("endDate",$endDate); 

的SimpleXML給了我下面的消息:Node no longer exists以下行:

foreach($document->notices->children() as $element)

+0

你檢查XML文檔是否正確裝入?不知道這是否是答案,但嘗試使用'DOMDocument :: load()'加載文件,並且不需要爲其創建新的DOMDocument實例。 – MahanGM

回答

0

我終於明白了。

PHP

$document = simplexml_import_dom($this->xml); 
$notice = ""; 

$xpathResults = $document->xpath('//notice'); 


foreach($xpathResults as $element) 
{ 
    $elementID = $element->id[0]; 
    $domXML = dom_import_simplexml($element); 

    if((string) $noticeID == $id) 
    { 
     $notice = $domXML; 

    } 
} 
+0

你可以直接用xpath來做到這一點。你可能需要找出*爲什麼*它不適合你,可能'$ id'包含不同的東西,或者你的xpath表達式是borked。使用變量,如果它不起作用,你可以var_dump這些,看看發生了什麼:http://eval.in/6307 – hakre