web-dev-qa-db-ja.com

DOMDocumentを使用してノードのテキストを置き換える方法

これは、既存のXMLファイルまたは文字列をDOMDocumentオブジェクトにロードする私のコードです。

$doc = new DOMDocument();
$doc->formatOutput = true;

// the content actually comes from an external file
$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));

タイトル、説明、リンクタグ内の値を上書きする必要があります。上記のコードの最後の3行は、私の試みです。ノードが空でない場合、テキストは既存のコンテンツに「追加」されます。ノードのテキストコンテンツを空にして、新しいテキストを1行に追加するにはどうすればよいですか。

27
Salman A

セットする - DOMNode::$nodeValue 代わりに:

$doc->getElementsByTagName("title")->item(0)->nodeValue = $titleText;
$doc->getElementsByTagName("description")->item(0)->nodeValue = $descriptionText;
$doc->getElementsByTagName("link")->item(0)->nodeValue = $linkText;

これにより、既存のコンテンツが新しい値で上書きされます。

47
lonesomeday

doub1ejackが言及したように

$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));

5
Raaghu