2017-07-13 67 views
1

我有一個XML導出器,它從我的數據庫創建提要,並且我有一個轉義方法,以便我的數據的XML敏感字符不會與XML標記衝突。XML轉義字符 x03

這種方法看起來像這樣:

def escape(m_str): 
    m_str = m_str.replace("&", "&") 
    m_str = m_str.replace("\n", "<br />") 
    m_str = m_str.replace("<", "&lt;") 
    m_str = m_str.replace(">", "&gt;") 
    m_str = m_str.replace("\"", "&quot;") 
    return m_str 

我使用LXML庫這個劇本,我有以下問題:

其中描述的含有\x03(不要問我爲什麼在描述中有這個角色,但是我們有這個角色)。

爲了更直觀的人來說,這裏是有問題的說明的樣本:

to_be_escaped 
> 'gnebst G' 
[(x,ord(x)) for x in to_be_escaped] 
> <class 'list'>: [('g', 103), ('\x03', 3), ('n', 110), ('e', 101), ('b', 98), ('s', 115), ('t', 116), (' ', 32), ('G', 71)] 

你可以看到第一個「空間」是不是一個真正的空間,但一個End of text字符(ref),第二個是「正常的空間」(十進制32,ref

的問題是,lxml的嚴正很糟糕吧,這裏是代碼:

description = et.fromstring("<volltext>%s</volltext>" % cls.escape(job.description)) 

其輸出(這個角色):

PCDATA無效字符值3,第1行

我的問題是:

  • 當然,我可以延長我的逃跑方法解決問題,但保證我不會與另一個角色發生?
  • 我在哪裏可以找到LXML中「禁止」字符的列表?
  • 是否有其他人處理這種問題,並作爲一個適當的逃避方法(作爲內置的比我做得更好)?

回答

0

我找到了一個答案的開頭there(所有學分都非常明確的解釋)。

問題的根本在於,utf-8字符的映射在默認情況下不夠好,我們需要指定源編碼爲utf8。

我們可以通過改變以下行做到這一點:

et.fromstring("<volltext>%s</volltext>" % cls.escape(job.description)) 

et.fromstring("<volltext>%s</volltext>" % cls.escape(job.description), parser=XMLParser(encoding='utf-8', recover=True)) 

爲了更加有彈性和魯棒性。