python - 读取带有二进制内容的 XML

标签 python xml

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

There is one case in which the file is not a valid XML document. When the AppendedData section is not encoded as base64, raw binary data is present that may violate the XML specification. This is not default behavior, and must be explicitly enabled by the user.

例如,检查 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 的数据。请参阅以下选项:How to parse invalid (bad / not well-formed) XML?

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

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

关于python - 读取带有二进制内容的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58915179/

相关文章:

python 3 保存字典

Python:尝试比较索引处的两个字符串时列出索引超出范围?

javascript - 我可以向另一个域发出 XMLHttpRequest 吗?

xml - 查找 XML 属性值并将其从一个文件替换到另一个文件

java - 如何创建看起来 TextView 比它大的列表项?

python - 根据最近距离找到最佳的唯一邻居对

python - tkinter notebook.tab : text (title) displayed incorrectly

java - DOM XML - 如何获取子节点?

python - Matplotlib 透明颜色图

Java JAXB : XML to Java object conversion