【问题标题】:lxml crashes when parsing character from the special font解析特殊字体中的字符时,lxml 崩溃
【发布时间】:2016-05-19 07:52:12
【问题描述】:

我尝试使用 lxml.etree.parse() 解析以下 XML 文件。此 XML 在第 3 行包含来自特殊字体的字符。此字符来自 Dingbats 字体 - 值 0x 7 - 电话象形图。在 Notepad++ 中,它显示为 BEL - 黑色矩形内的白色字母。我无法将这个字符插入问题中。

<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
      <layer pass="0" class="FontMarker" locked="0">
      <prop k="chr" v="!!!SPECIAL_CARACTER_HERE!!!"/>
      </layer>
</qgis>

这个字符使 lxml(xml 也崩溃)崩溃并出现以下错误:

  File "lxml.etree.pyx", line 3193, in lxml.etree.parse (src/lxml/lxml.etree.c:64168)
  File "parser.pxi", line 1548, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:91390)
  File "parser.pxi", line 1577, in lxml.etree._parseDocumentFromURL (src/lxml/lxml.etree.c:91674)
  File "parser.pxi", line 1477, in lxml.etree._parseDocFromFile (src/lxml/lxml.etree.c:90741)
  File "parser.pxi", line 1024, in lxml.etree._BaseParser._parseDocFromFile (src/lxml/lxml.etree.c:87655)
  File "parser.pxi", line 565, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:83243)
  File "parser.pxi", line 656, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:84225)
  File "parser.pxi", line 596, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:83549)
lxml.etree.XMLSyntaxError: invalid character in attribute value, line 3, column 14

如何解析这样的文档?

更新: A link to the file itself.

【问题讨论】:

  • 你需要那个角色还是可以去掉它?
  • @pacholik 我确实需要它,但解析大部分文件总比什么都不解析要好,因此排除此类字符的解决方法会有些令人满意。
  • 它显示为 BEL,因为 7 是代表 BEL en.wikipedia.org/wiki/Bell_character 的控制字符,你有字体和/或 xml 文件的链接吗?
  • @PadraicCunningham here is the link to file。不幸的是,我很难找到字体本身。
  • 您有手机象形文字字体示例的链接吗? xml 不支持控制字符,这似乎是源代码中的内容,您想从文件中获取什么?

标签: python xml parsing fonts lxml


【解决方案1】:

似乎 lxml 无法与之竞争。不过,您可以使用recover 来处理错误。

恢复 - 努力解析损坏的 XML

>>> from lxml import etree
>>> parser = etree.XMLParser(recover=True)
>>> tree = etree.parse("/tmp/qgis.xml", parser=parser)
>>> tree.find("layer/prop").attrib
{'v': '', 'k': 'chr'}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多