2012-07-15 39 views
2

我的Perl程序正在處理XML文件。有些條目可能包含&符號。解析器中斷,並說:「實體中的名稱無效」。XML中的編碼和符號

如何處理文件並在所有不正確的實體中編碼& -s?

所以,這將是這樣的:

<words>text1 & text2</words> --> <words>text1 &amp; text2</words> 
+0

您想要手動修復文件還是在程序中支持格式不正確的XML? – 2012-07-15 19:57:22

+0

我想支持手工創建的格式不正確的XML。使其成爲有效的XML。 – user4035 2012-07-15 23:56:29

+0

如果您使用XML :: LibXML,我認爲這是'recover'解析器選項將允許您忽略這些錯誤。 – ikegami 2012-07-16 03:04:41

回答

3

這是棘手,不平凡的,並且通常涉及權衡。當我遇到了類似的問題,更換&字符,隨後要麼&amp;大寫字符或(在正則表達式/\&[A-Z ]/)空格(和「尾隨字符」)解決了大多數情況下 - 這是通常不夠好,因爲你已經去了通過接受格式不正確的XML輸入來增加額外的英里數。

+0

在XML中,聲明具有像'&A;'這樣的大寫字母的實體是合法的,將文檔轉換爲XML的更好方法是使用否定斷言,即&後面沒有可能是有效的實體名稱。 '/ /(?![[:alpha:] _:] [\ w.:-]*;)/ & /'這並不完全符合XML標準中的所有Unicode情況,但它基本上足夠接近。 – 2012-07-16 17:51:37

6

這不是一個XML文件。如果它是XML,則&將被編寫爲&amp;。處理非XML文件很困難,因爲您無法使用XML解析器。最好修復創建該文件的程序,將其更改爲生成適當的格式良好的XML。