我的Perl程序正在處理XML文件。有些條目可能包含&符號。解析器中斷,並說:「實體中的名稱無效」。XML中的編碼和符號
如何處理文件並在所有不正確的實體中編碼& -s?
所以,這將是這樣的:
<words>text1 & text2</words> --> <words>text1 & text2</words>
我的Perl程序正在處理XML文件。有些條目可能包含&符號。解析器中斷,並說:「實體中的名稱無效」。XML中的編碼和符號
如何處理文件並在所有不正確的實體中編碼& -s?
所以,這將是這樣的:
<words>text1 & text2</words> --> <words>text1 & text2</words>
這是棘手,不平凡的,並且通常涉及權衡。當我遇到了類似的問題,更換&
字符,隨後要麼&
大寫字符或(在正則表達式/\&[A-Z ]/
)空格(和「尾隨字符」)解決了大多數情況下 - 這是通常不夠好,因爲你已經去了通過接受格式不正確的XML輸入來增加額外的英里數。
在XML中,聲明具有像'&A;'這樣的大寫字母的實體是合法的,將文檔轉換爲XML的更好方法是使用否定斷言,即&後面沒有可能是有效的實體名稱。 '/ /(?![[:alpha:] _:] [\ w.:-]*;)/ & /'這並不完全符合XML標準中的所有Unicode情況,但它基本上足夠接近。 – 2012-07-16 17:51:37
這不是一個XML文件。如果它是XML,則&
將被編寫爲&
。處理非XML文件很困難,因爲您無法使用XML解析器。最好修復創建該文件的程序,將其更改爲生成適當的格式良好的XML。
您想要手動修復文件還是在程序中支持格式不正確的XML? – 2012-07-15 19:57:22
我想支持手工創建的格式不正確的XML。使其成爲有效的XML。 – user4035 2012-07-15 23:56:29
如果您使用XML :: LibXML,我認爲這是'recover'解析器選項將允許您忽略這些錯誤。 – ikegami 2012-07-16 03:04:41