我正在使用Python 3.6.4和lxml 4.1.1。在读取/解析etree时,我转义了12个Unicode分隔符。 PSEP看起来像这样:
line = line.replace('\u2029', ' %(#u2029)s '
经过大量的过滤/处理后,我使用以下代码将行保存到新的XML文件中:
seg = etree.SubElement(tuv, 'seg')
seg.text = line.replace('%(#u2029)s', '\u2029')
产生以下追溯:
Traceback (most recent call last):
File "C:\process-tmx\", line 267, in run
seg.text = line.replace('%(#u2029)s', '\u2029')
File "src\lxml\xtree.pyx", line 1033, in lxml.etree._Element.text.__set__ (src\lxml\etree.c:55075)
File "src\lxml\apihelpers.pxi", line 716, in lxml.etree._setNodeText (src\lxml\etree.c:25862)
File "src\lxml\apihelpers.pxi", line 704, in lxml.etree._createTextNode (src\lxml\etree.c:25725)
File "src\lxml\apihelpers.pxi", line 1444, in lxml.etree._utf8(src\lxml\etree.c:32944)
ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
这是否意味着'\ u2029'是XML不兼容的Unicode?我如何逃避XML?
由于
答案 0 :(得分:1)
在XML in XML和其他标记语言文档中,有一个名为Characters not Suitable for Use in Markup的部分。本节实际上并未强制要求U + 2029在XML中是非法的,但它表示不鼓励使用它。
阅读整个部分了解详情,但简短版本如下:
如果您实际上将它用作段落分隔符,则应该使用段落分隔符作为特定的XML语言。对于XHTML,文档中的示例为<xhtml:br />
或<xhtml:p></xhtml:p>
。
如果你只是将它作为一个非XML文本中间的字符使用,那么你就会把它放入XML文档的一个字段中,你会想要逃避它。怎么样?好吧,如果你正在编写创建代码和消费代码,你可以随心所欲地逃避它,只要你可以在另一端解除它。如果其他人正在编写消费代码,您必须生成他们期望的任何内容。如果消费代码是通用的(比如在Firefox中显示原始XML),那么你会希望它是最终用户可读的东西。
对于最后一种情况,你可能实际上想要使用U + 2029,尽管它“灰心丧气”。但看起来lxml
不会让你这样做,因为它比必要的更严格。这并不是太不合理(你知道,严格按照你自己生产的东西,所谓的消费和所有这些),但如果你有一个令人烦恼的用例,它仍然很烦人。在这种情况下,你需要找到一种方法来覆盖它的作用 - 如果没有配置设置,比如将它一直编码到lxml
,然后在lxml
完成之后对其进行转换,就在你把它写到文件/套接字/之前。