Привет, я просмотрел документ 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». Затем он добавляет новый элемент к каждому найденному элементу.
Главное, что я изменил, это то, что вы добавляете идентификатор в $append
и не $item
,
Если вы хотите просто обновить первый экземпляр определенного фрагмента текста …
$matchList = $xpath->query("//*[contains(text(), 'Black')]");
$element = $dom->createElement('ID', '123');
$matchList->item(0)->appendChild($element);
echo $dom->saveXML().PHP_EOL;
Других решений пока нет …