2013-06-01 37 views
-1

我有下面的XML文件:如何設置XML屬性值的變化,如果XML元素名稱是相同

<root> 
    <SignUp user_id = 'joseph' image = 'myByk.jpg' /> 
    <SignUp user_id = 'jack' image = 'myCar.jpg' /> 
    <SignUp user_id = 'lamp' image = 'myhome.jpg' /> 
</root> 

在這個文件中我想要得到與user_idjack」的SignUp元素,並改變其image屬性。

我曾嘗試下面的PHP代碼:

<?php 
    $dom = new DomDocument(); 
    $dom->load('data_out.xml'); 
    $xp = new DomXPath($dom); 
    $res = $xp->query("//*[@user_id = 'jack']"); 
    $xp->SignUp->attributes()->image = "my School.jpg"; 
    $dom->save('data_out.xml'); 
?> 

然而,它似乎並沒有工作...

回答

1

由於在query你要通過屬性,你可以有多個結果因此它被包裹在某種列表中(dom node list)。

這是我在想什麼(未經測試):

<?php 
    $dom = new DomDocument(); 
    $dom->load('data_out.xml'); 
    $xp = new DomXPath($dom); 
    $res = $xp->query("//*[@user_id = 'jack']"); 
    $res->item(0)->setAttribute("image", "my School.jpg"); 
    $dom->save('data_out.xml'); 
?> 

相似的代碼在sandbox成功測試:

$dom = new DomDocument(); 
$dom->loadXML(
    "<root> 
     <SignUp user_id = 'joseph' image = 'myByk.jpg' /> 
     <SignUp user_id = 'jack' image = 'myCar.jpg' /> 
     <SignUp user_id = 'lamp' image = 'myhome.jpg' /> 
    </root>" 
); 
$xp = new DomXPath($dom); 
$res = $xp->query("//*[@user_id = 'jack']"); 
$res->item(0)->setAttribute("image", "my School.jpg"); 
$ret = $dom->saveXML(); 
echo $ret; 

回報

<?xml version="1.0"?> 
<root> 
    <SignUp user_id="joseph" image="myByk.jpg"/> 
    <SignUp user_id="jack" image="my School.jpg"/> 
    <SignUp user_id="lamp" image="myhome.jpg"/> 
</root> 
+0

這個返回錯誤在第6行'調用未定義的方法DOMXPath ::項目( )' –

+0

對,現在應該修正,被解引用了錯誤的變量。 – zsawyer

+0

你這是工作,但我不使用XML作爲一個字符串這是什麼? –

1

那麼也許op應該考慮ER使用SimpleXML:

if ($root = simplexml_load_file('xml.xml')) 
{ 
    //access attributes like an array: 
    echo $root->SignUp[0]["user_id"] . "\n"; 

    $target_elements = $root->xpath("//*[@user_id = 'jack']"); 
    $target_elements[0]["image"] = "mySchool.jpg"; 
    $root->asXML('datat_out.xml'); 

} 

注意更改屬性,你不必使用繁瑣:

$target_attr = "image"; 
$target_elements[0]->attributes()->$target_attr = "hello"; 
+0

+1是一個很好的選擇 – zsawyer

相關問題