2010-01-12 17 views
1

我想解析一個XML字符串,其中包含TEXTDATA中的字符& <和>。通常,這些字符應該是htmlencoded,但在我的情況下,他們不是這樣,我得到以下消息:PHP DOMDocument-> loadXML,其中包含&符號/ less/greater?

警告:DOMDocument :: loadXML()[function.loadXML]:錯誤解析實體中的屬性名稱... 警告:DOM文檔:: loadXML的()[function.loadXML]:開始標記找不到結束......

我可以使用str_replace函數來編碼所有&,但如果我這樣做有<或>我也是爲了有效的XML標籤。

有誰知道這個問題的解決方法?

謝謝!

+3

非格式化XML的解決方法是責怪誰寫的:) – OcuS 2010-01-12 14:03:05

回答

5

如果你有一個XML一個<裏面的文字... 它不是一個有效的XML。嘗試對其進行編碼或將其編入<![CDATA[

如果這是不可能的(因爲你不輸出這個「XML」),我會建議嘗試一些Html解析庫(我沒有使用它們,但它們存在),因爲它們沒有那麼嚴格XML的。

但我真的想在嘗試任何其他事情之前獲得有效的XML!

+0

感謝您的提示。我將首先看看是否可以更改傳入的XML流,如果沒有,我會嘗試HTML解析器... – nikola 2010-01-12 15:22:07

3

我經常在調用DomDocument的load()之前使用@,主要是因爲您永遠無法完全確定您加載的是什麼,這是您的預期。

使用@會抑制錯誤。

@$dom->loadXml($myXml); 
0

將所有的文本放入CDATA元素中?

<!-- Old --> 
<blah> 
    x & y < 3 
</blah> 

<!-- New --> 
<blah><![CDATA[ 
    x & y < 3 
]]></blah> 
1

我可以使用str_replace函數來編碼所有&,但如果我這樣做有<或>我這樣做是爲了有效的XML標籤了。

作爲一個嚴格的臨時修正措施,你可以替換不是什麼看起來像一個標記或實體引用部分的,如:

$str= preg_replace('<(?![a-zA-Z_!?])', '&lt;', $str); 
$str= preg_replace('&(?!([a-zA-Z]+|#[0-9]+|#x[0-9a-fA-F]+);)', '&amp;', $str); 

然而,這並非水密,從長遠來看,您需要修復產生這種虛假標記的任何內容,或者對需要修復它的人員大喊大叫,直到他們得到線索。按照定義,這樣的格式非格式良好的XML是,根本不是XML