2011-12-14 69 views
1

目前,具有這種用於將數據追加到我的項目IM文件:更新現有元素在XML與PHP

$xmldoc = new DOMDocument(); 
    $xmldoc->load('ex.xml'); 


    $item= $xmldoc->createElement('item'); 

    $item->setAttribute('id', '100'); 
    $item->setAttribute('category', 'Fitness'); 
    $item->setAttribute('name', 'Basketball'); 
    $item->setAttribute('url', 'http://google.com'); 
    $item->setAttribute('description', 'This is a description'); 
    $item->setAttribute('price', '899'); 


    $xmldoc->getElementsByTagName('items')->item(0)->appendChild($item); 
    $xmldoc->save('ex.xml'); 

現在追加在此之前,我想檢查具有現有元素「項」相同的屬性ID值。

如果是這樣,它應該用這些新數據更新該元素。

目前它只是追加和不檢查任何東西。

回答

2
$xmldoc = new DOMDocument(); 
$xmldoc->load('ex.xml'); 

$xpath = new DOMXPath($xmldoc); 
$query = $xpath->query('/mainXML/items/item[@id = "100"]'); 

$create_new_node = false; 
if($query->length == 0) 
{ 
    $item = $xmldoc->createElement('item'); 
    $create_new_node = true; 
} 
else 
{ 
    $item = $query->item(0); 
} 

$item->setAttribute('id', '100'); 
$item->setAttribute('category', 'Fitness'); 
$item->setAttribute('name', 'Basketball'); 
$item->setAttribute('url', 'http://google.com'); 
$item->setAttribute('description', 'This is a description'); 
$item->setAttribute('price', '899'); 

if($create_new_node) 
{ 
    $xmldoc->getElementsByTagName('items')->item(0)->appendChild($item); 
} 
$xmldoc->save('ex.xml'); 
+0

沒有工作,試過這個和你剛纔查詢的解決方案 - 它只是追加 – Karem 2011-12-14 23:13:44

1

我沒有用過這個功能,但看起來像一個很好的匹配DOMDocument: Get Element By ID

如果你得到一個匹配的元素,編輯它,如果沒有,張貼了。

+0

`getElementById`不能用於xml,除非它有一個指定哪些屬性是'ID`類型的DTD – 2011-12-14 23:19:39

0

如果你有其指定的「id」屬性是一個ID類型此XML文件一個DTD(即,其值是在文檔中的獨特和唯一地標識其元件),那麼就可以使用DOMDocument::getElementById()

但是,您最有可能沒有DTD。在這種情況下,您應該只使用XPath:

$xmldoc = new DOMDocument(); 
$xmldoc->load('ex.xml'); 

$xpath = new DOMXPath($xmldoc); 
$results = $xpath->query('//items/item[@id=100][0]'); 

if (!$results->length) { 
    $item= $xmldoc->createElement('item'); 
    $item->setAttribute('id', '100'); 
    $item->setAttribute('category', 'Fitness'); 
    $item->setAttribute('name', 'Basketball'); 
    $item->setAttribute('url', 'http://google.com'); 
    $item->setAttribute('description', 'This is a description'); 
    $item->setAttribute('price', '899'); 

    $xmldoc->getElementsByTagName('items')->item(0)->appendChild($item); 
    $xmldoc->save('ex.xml'); 
} 

您還應該考慮使用SimpleXML來執行此任務。這個XML的結構和操作方式可能更適合SimpleXML。