我正在处理二进制文件。在这个二进制文件中,我可以提取似乎是UTF-16 XML(little-endian)文件。
如果我提取数据,并尝试从控制台转储它(运行debian / jessie amd64),这就是我得到的:
$ xmllint --format D5905822-DFF9-7944-9CFE-258264B8162E.UNK
D5905822-DFF9-7944-9CFE-258264B8162E.UNK:1: parser error : Char 0x0 out of allowed range
<
^
D5905822-DFF9-7944-9CFE-258264B8162E.UNK:1: parser error : StartTag: invalid element name
<
^
我找不到xmllint手册中的任何内容来帮助我,所以我从网上下载了一个UTF-16 Little endian文件,来自here。我删除了实际的XML数据,只保留第一行(编码):
$ cat header
��<?xml version="1.0" encoding="UTF-16"?>
$ hexdump header
0000000 feff 003c 003f 0078 006d 006c 0020 0076
0000010 0065 0072 0073 0069 006f 006e 003d 0022
0000020 0031 002e 0030 0022 0020 0065 006e 0063
0000030 006f 0064 0069 006e 0067 003d 0022 0055
0000040 0054 0046 002d 0031 0036 0022 003f 003e
0000050 000d 000a
0000054
现在我可以正确使用xmlling:
$ cat header D5905822-DFF9-7944-9CFE-258264B8162E.UNK > bla.xml
$ xmllint --format bla.xml
��<?xml version="1.0" encoding="UTF-16"?>
<InteractiveMeasurement>
<InteractiveMeasurementRecord ElementUniqueName="f0c9b1c6-9a5c-40cd-8303-e507bb539cdc" IsValid="true">
[...]
没有其他更简单的解决方案吗?为什么读取UTF-16 Little-endian XML文件这么复杂?
答案 0 :(得分:1)
The XML C parser and toolkit of Gnome Encodings support表示此行为是设计性的,作者质疑为什么有人会想要其他任何内容。 XMLLint为输出编码提供了一个参数,但没有为输入执行此操作。
看起来可以使用进一步的编码扩展解析器,但这可能无法超越默认的启发式。