2013-08-20 49 views
1

我正在寫一個PHP腳本來生成一些XML文檔,我有一些問題與SimpleXML和報價。PHP的SimpleXMLElement不引用到實體

如果我有這樣的代碼:

$xml = new SimpleXMLElement('<myxml />'); 
$xml->addChild('title','My Feed'); 
$xml->addChild('description','Entity data here - &amp; &quot; &apos;'); 

如果我的print_r的$ XML OBJ然後我得到這樣的:

print_r($xml); 
SimpleXMLElement Object 
(
    [title] => My Feed 
    [description] => Entity data here - & " ' 
) 

這似乎一旦在對象它使實體回他們各自的人物。然而,當我打電話asXML()的對象來獲取XML它表明我:

echo $xml->asXML(); 
<?xml version="1.0"?> 
    <myxml> 
    <title>My Feed</title> 
    <description>Entity data here - &amp; " '</description> 
</myxml> 

它使&回一個實體,但它似乎離開報價爲字符。它不應該把它們全部轉換成實體嗎?

回答

4

"'只是XML中的特殊字符,如果它們在屬性值內。在元素的文本內容中,關於"'的含義沒有歧義,因爲正在查找的下一個特殊標記是<以開始打開或關閉標記。

所以雖然<foo bar="hello "world"" />是無效的XML,<foo>hello "world"</foo>不是,所以沒有轉義是要求

(只是因爲它不是需要,並不意味着它不可能,所以有可能是一個更全面的回答,爲什麼SimpleXML的不至少保留你放在那裏自願的實體。)

0

好像問題是一個深一點: https://bugs.php.net/bug.php?id=49437

這是一個「功能」或潛在的libxml 錯誤:在默認情況下所有實體(除LTgt and &)正在未轉義。

這裏的諷刺之處在於,您可以顯式啓用unescaping(LIBXML_NOENT),但您無法禁用它。

我發現了處理它的唯一方法:使用CData其中數據保持原樣不變的節點。但這當然不是理想的解決方案。