读取具有二进制内容的XML

尼科·施洛默(NicoSchlömer)

我想使用Python读取VTU文件,该文件是XML,可能原始包含二进制数据。规格说明:

在一种情况下,文件不是有效的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

有什么提示吗?

克休斯

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

在上游解决问题:首先直接编码为Base64,而不是直接嵌入二进制数据

也可以看看


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

然后,您处于无法接收非XML数据的位置。请参阅以下内容供您选择:如何解析无效(格式错误/格式错误)的XML?

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章