我想使用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^º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规范的后果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句