2017-11-25 179 views
0

嗨我通過一個XML文檔循環搜索特定的Word(那工程),然後我想要一個特定的元素,如果該單詞包含在該部分。如何查找某個XML元素並將其添加爲新的?

<product> 
    <title>TestProduct</title> 
    <Specifications> 
     <item name="Specifications1">Test</item> 
     <item name="Specifications2">Hello World</item> 
    </Specifications> 
    <body> 
     <item name="Color">Black</item> 
    </body> 
</product> 

我嘗試這樣做:

<?php 

$dom = new DOMDocument; 
$dom->load('Test.xml'); 
# set up the xpath 
$xpath = new DOMXPath($dom); 
$append= $dom->getElementsByTagName('Text'); 
print_r($append); 
foreach ($xpath->query("*[contains(., 'Test')]") as $item) { 
    $element = $dom->createElement('ID', '123'); 
    $append->appendChild($element); 
}  
?> 

,但它不工作,能有人給我一個提示?坦克;)

回答

1

問題是,你試圖將新元素添加到錯誤的地方。這將getElementsByTagName和XPath組合成一個循環,然後將新元素添加到找到的任何元素。

$dom = new DOMDocument; 
$dom->load('Test.xml'); 
$xpath = new DOMXPath($dom); 
foreach ($xpath->query("//*[contains(., 'Black')]") as $item) { 
    $element = $dom->createElement('ID', '123'); 
    $item->appendChild($element); 
} 

echo $dom->saveXML(); 

看看XPath如何找到包含'Test'的任何元素。然後它將新元素添加到它找到的每個元素。 我改變的主要原因是您將ID添加到$append而不是$item

如果你想只更新特定一段文本的第一個實例...

$matchList = $xpath->query("//*[contains(text(), 'Black')]"); 
$element = $dom->createElement('ID', '123'); 
$matchList->item(0)->appendChild($element); 
echo $dom->saveXML().PHP_EOL; 
+0

所以我應該在循環之後添加的元素? – NeunNatter

+0

其實它不會添加任何我不知道該怎麼做 – NeunNatter

+0

你有一些XML來測試這個嗎?它使它更容易。 –

相關問題