Это мой код, который загружает существующий XML-файл или строку в объект DOMDocument:
$doc = new DOMDocument(); $doc->formatOutput = true; if(is_file($filePath)) { $doc->load($filePath); } else { $doc->loadXML('<rss version="2.0"><channel><title></title><description></description><link></link></channel></rss>'); } $doc->getElementsByTagName("title")->item(0)->appendChild($doc->createTextNode($titleText)); $doc->getElementsByTagName("description")->item(0)->appendChild($doc->createTextNode($descriptionText)); $doc->getElementsByTagName("link")->item(0)->appendChild($doc->createTextNode($linkText));
Мне нужно перезаписать значение внутри тегов заголовка, описания и ссылки. Последние три строки в приведенном выше коде являются моей попыткой сделать это; но кажется, что как только файл будет создан, текст будет «добавлен» к существующему. Как я могу удалить текстовое содержимое узла (предположим DOMNode) и добавить новый текст в одну строку.
PS: Если есть встроенный альтернативный (класс или библиотека), который требует меньше LOC для выполнения простых задач, таких как этот, тогда дайте мне знать.
DOMNode::$nodeValue
установите DOMNode::$nodeValue
:
$doc->getElementsByTagName("title")->item(0)->nodeValue = $titleText; $doc->getElementsByTagName("description")->item(0)->nodeValue = $descriptionText; $doc->getElementsByTagName("link")->item(0)->nodeValue = $linkText;
Это перезаписывает существующий контент с новым значением.
как упоминалось в двух словах
$doc->getElementsByTagName("title")->item(0)->nodeValue = $titleText;
выдаст ошибку, если $titleText = "& is not allowed in Node::nodeValue";
Поэтому лучшим решением будет
// clear the existing text content $doc->getElementsByTagName("title")->item(0)->nodeValue = "";
// then create new TextNode $doc->getElementsByTagName("title")->item(0)->appendChild($doc->createTextNode($titleText));