我想使用Python读取一个VTU文件,该文件是XML,可能包含二进制数据。规格说:
有一种情况是,文件不是有效的XML文档。当AppendedData部分未编码为base64时,就会出现可能违反base64规范的原始二进制数据。这不是默认行为,必须由用户显式启用。
例如,检查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有什么暗示吗?
发布于 2019-11-18 13:16:19
问题是,由于数据包含非法字符,所以数据不是XML,因此任何符合XML的解析器都会正确地拒绝它。
修复上游的问题:而不是直接嵌入二进制数据,首先编码为Base64。
也见
我不能解决上游的问题.
然后,您将处于一个不幸的境地,即接收到的数据不是XML。有关选项,请参见以下内容:如何解析无效(糟糕/不正确) XML?
...since二进制内容是VTU规范的一部分.
任何在XML中包含无约束二进制数据的规范都会被破坏。您的选项包括解析糟糕的XML (请参阅上面的链接),只使用罪犯提供的库/工具包,或者编写您自己的库/工具箱--这不是很好的选项,但这是供应商不遵循XML规范的后果。
https://stackoverflow.com/questions/58915179
复制相似问题