首页 > 解决方案 > 读取带有二进制内容的 XML

问题描述

我想使用 Python 来读取一个 XML 格式的 VTU 文件,并且可能包含二进制数据。规范说:

在一种情况下,文件不是有效的 XML 文档。当 AppendedData 部分未编码为 base64 时,存在可能违反 XML 规范的原始二进制数据。这不是默认行为,必须由用户明确启用。

例如,检查dragon.vtu

<VTKFile type="UnstructuredGrid" version="1.0" byte_order="LittleEndian" header_type="UInt64">
  <UnstructuredGrid>
    <Piece NumberOfPoints="69827" NumberOfCells="139650">
      <Cells>
        <DataArray type="Int64" Name="connectivity" format="appended" RangeMin="" RangeMax="" offset="837932"/>
        <DataArray type="Int64" Name="offsets" format="appended" RangeMin="" RangeMax="" offset="4189540"/>
        <DataArray type="UInt8" Name="types" format="appended" RangeMin="" RangeMax="" offset="5306748"/>
      </Cells>
    </Piece>
  </UnstructuredGrid>
  <AppendedData encoding="raw">
   _$É�����ıAdÌAÁÊÃÿ@>yAn£GÁÏAA(~AÁþ`AF¶Áo.@Ô«¬A3Ä|Ásc2@ï8±A cÁÉX@®AZ/AϱÁ:»AA)³Á(ÉAs!AFÁ\A½A*ÁyA*)AéÔÁØÓAÀ¡Aã_ÁóA`öBÌ]gADé¸AdBdÌnA|r·AhB^ºnA­zºAȦ
   [...]

天真地做

import xml.etree.ElementTree as ET
parser = ET.XMLParser()
tree = ET.parse("dragon.vtu", parser)

不起作用:_

Traceback (most recent call last):
  File "f.py", line 3, in <module>
    tree = ET.parse("dragon.vtu", parser)
  File "/usr/lib/python3.7/xml/etree/ElementTree.py", line 1197, in parse
    tree.parse(source, parser)
  File "/usr/lib/python3.7/xml/etree/ElementTree.py", line 604, in parse
    parser.feed(data)
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 28, column 5

有什么提示吗?

标签: pythonxml

解决方案


问题是由于包含非法字符,您的数据不是 XML,因此任何符合标准的 XML 解析器都会正确拒绝它。

修复上游问题:不是直接嵌入二进制数据,而是先编码为Base64

也可以看看


我无法解决上游的问题...

然后,您将处于收到非 XML 数据的不幸境地。请参阅以下内容以获取您的选项:如何解析无效(错误/格式不正确)的 XML?

...因为二进制内容是 VTU 规范的一部分。

任何在 XML 中包含不受约束的二进制数据的规范都被破坏了。您的选择包括解析错误的 XML(请参阅上面的链接)、仅使用罪魁祸首提供的库/工具包或编写自己的库/工具包 - 不是很好的选择,但这就是供应商不遵循 XML 规范的后果。


推荐阅读