2017-07-13 69 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)) 

为了更加有弹性和鲁棒性。