我正在使用python3.6.4和lxml4.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?我该如何逃脱它?你知道吗
谢谢
在Unicode-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
完成后,在将其写入文件/套接字/任何内容之前对其进行转换。你知道吗相关问题 更多 >
编程相关推荐