2011-05-14 92 views
24

這是我的代碼加載一個現有的XML文件或字符串轉換成DOMDocument對象:PHP 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做簡單的任務(一個類或庫),如這一個,然後不要讓我知道。

回答

38

套裝DOMNode::$nodeValue代替:

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

這將覆蓋新值的現有內容。

+3

但是,如果這些字符串中存在非xml安全字符,會不會失敗?我認爲這就是爲什麼OP使用'createTextNode()'。 – doub1ejack 2015-03-24 20:16:27

3

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

+2

這會清除舊節點並添加另一個節點,從而留下兩個節點。最好創建新節點並用它來替換舊節點 – patrick 2015-11-27 14:18:30