【问题标题】:Printing out messages from a lxml error log in UTF-8 format以 UTF-8 格式从 lxml 错误日志中打印消息
【发布时间】:2014-05-24 20:46:38
【问题描述】:

我学习 python(2.7 版本),我有任务使用 lxml 库 (http://lxml.de/) 通过 xsd 模式检查 xml 文档。我有两个文件 - 像这样的例子:

$ cat 1.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE yml_catalog SYSTEM "shops.dtd">
<a>
  <b>Привет мир!</b>
</a>

$cat 2.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="a" type="AType"/>
  <xs:complexType name="AType">
    <xs:sequence>
      <xs:element name="b" type="xs:decimal" />
   </xs:sequence>
  </xs:complexType>
</xs:schema>

它应该很简单,但我不明白如何将 lxml 与 utf-8 一起使用(从不努力使用编码)。我做了简单的步骤:

>>> from lxml import etree
>>> schema = etree.parse("/tmp/qwerty/2.xsd")
>>> xmlschema = etree.XMLSchema(schema)
>>> try:
    document = etree.parse("/tmp/qwerty/1.xml")
    print "Parse complete!"
except etree.XMLSyntaxError, e:
    print e

Parse complete!
>>> xmlschema.validate(document)
False
>>> xmlschema.error_log

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    xmlschema.error_log
  File "xmlerror.pxi", line 286, in lxml.etree._ListErrorLog.__repr__ (src/lxml/lxml.etree.c:33216)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 85-90: ordinal not in range(128)

而且我无法从 .error_log 中获取所有引发的异常。

有任何使用编码/解码方法的解决方法来检查它(成功)或者解决方案(并且没有另一个库(我谈论标准python方法)),或者我需要使用StringIO(但是如何)?

我知道我的问题在于“Привет мир!”和 xs:decimal - 这些只是示例(简短)。对不起我的英语不好。谢谢。

【问题讨论】:

  • 使用另一种语言和字符串“Hello world!”,而不是“Привет мир!”没问题:>>> xmlschema.error_log /tmp/qwerty/1.xml:4:0:ERROR:SCHEMASV:SCHEMAV_CVC_DATATYPE_VALID_1_2_1:元素'b':'Hello world!'不是原子类型“xs:decimal”的有效值。

标签: python xml parsing xsd lxml


【解决方案1】:

您必须使用utf-8 对错误日志中的错误消息进行编码。请尝试以下操作:

代码:

from lxml import etree

schema = etree.parse("2.xsd")
xmlschema = etree.XMLSchema(schema)

try:
    document = etree.parse("1.xml")
    print "Parse complete!"
except etree.XMLSyntaxError, e:
    print e

print xmlschema.validate(document)
for error in xmlschema.error_log:
    print "ERROR ON LINE %s: %s" % (error.line, error.message.encode("utf-8"))

结果:

Parse complete!
False
ERROR ON LINE 4: Element 'b': 'Привет мир!' is not a valid value of the atomic type 'xs:decimal'.
[Finished in 1.3s]

相关文档可以在here找到。

如果这有帮助,请告诉我们。

【讨论】:

  • 这并不愚蠢,tbh。但是,检查您是否有问题的最佳方法是首先检查文档,因为我在阅读您的问题后立即检查了文档。 :) 不客气,祝你好运!
猜你喜欢
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2014-10-23
相关资源
最近更新 更多