2017-11-25 213 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来测试这个吗?它使它更容易。 –

相关问题