如何查找某个XML元素并将其添加为新的?
问题描述:
嗨我通过一个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);
}
?>
,但它不工作,能有人给我一个提示?坦克;)
答
问题是,你试图将新元素添加到错误的地方。这将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;
所以我应该在循环之后添加的元素? – NeunNatter
其实它不会添加任何我不知道该怎么做 – NeunNatter
你有一些XML来测试这个吗?它使它更容易。 –