python - 读取带有二进制内容的 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^ºnAzº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 规范的后果。
推荐阅读
- scala - 更新顶点时不支持 Apache Gremlin 将属性结果更新为属性添加
- javascript - 出现“相对”和“固定”之间的元素变换过渡不平滑
- javascript - 将循环变成数组映射
- python - 使用 .config 方法分配带有变量的标签后,Tkinter 应用程序未启动
- node.js - 如何计算 NodeJS 项目中 npm 依赖使用的百分比?
- docker - 如果 host+pid 就足够了,为什么还要使用 pod id 或 container id?
- android - 在android中将图像保存为位图时出现问题
- haskell - 我可以从模式同义词中捕获值吗?
- vb.net - 读取大文本文件非常慢
- php - 如何检查数组的元素是否存在于另一个数组数组中