Как найти определенный XML-элемент и добавить его как новый?

Привет, я просмотрел документ 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);
}
?>

но это не работает, может кто-нибудь дать мне подсказку? Танки;)

0

Решение

Проблема в том, что вы пытаетесь добавить новый элемент в неправильное место. Это объединяет 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». Затем он добавляет новый элемент к каждому найденному элементу.
Главное, что я изменил, это то, что вы добавляете идентификатор в $append и не $item,

Если вы хотите просто обновить первый экземпляр определенного фрагмента текста …

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]