如何解析XML中无效字符数的引用?

时间:2018-02-20 04:07:49

标签: xml xml-parsing

我已经获得了一个XML文件,但是它正在加载无效字符。我没有XML经验,但有没有办法解析数据(可能用正则表达式)来显示正确的值?或者数据是否已损坏?

以下是XML中的输出:

<Name>&#x0;&#x0;&#x0;&#x0;&#x0;+&#xB;&#x1;&#x4;?&#x2;?&#x0;&#x0;&#x0;&#x0;&#x0;??A~?&#x0;G~?&#x4;&#x0;&#x0;??&#x12;</Name>

抛出的错误是:

XML解析错误:对无效字符编号的引用

2 个答案:

答案 0 :(得分:0)

“XML”中的所有字符实体(&#x0;等)都不在XML规范允许的范围内,因此您的数据实际上不是XML - 它不是well-formed

没有正则表达式无济于事。

是的,看起来您的数据在某种程度上是错误的或损坏的,因为名称通常不包含空字符和控制字符,即使XML确实允许这样的字符。

答案 1 :(得分:0)

实际上,您也可以尝试使用html.unescape函数,或将&#<something>;替换为[#something;](或类似名称)。第一种方法每个坏字符仅产生一个字符,但是可以产生具有不同输入字符的。第二种方法是每个坏字符产生一个字符序列,但是有时最好看看原始输入是什么样。

示例

from xml.etree import ElementTree as ET
import re

s = "<Name>&#x0;&#x0;&#x0;&#x0;&#x0;+&#xB;&#x1;&#x4;?&#x2;?&#x0;&#x0;&#x0;&#x0;&#x0;??A~?&#x0;G~?&#x4;&#x0;&#x0;??&#x12;</Name>"

ET.fromstring(html.unescape(s)).text
# Out: '�����+??�����??A~?�G~?��??'

# Replace &#anything123; with [#anything123;]
ET.fromstring(re.sub(r'&#([a-zA-Z0-9]+);?', r'[#\1;]', s)).text
# Out: '[#x0;][#x0;][#x0;][#x0;][#x0;]+[#xB;][#x1;][#x4;]?[#x2;]?[#x0;][#x0;][#x0;][#x0;][#x0;]??A~?[#x0;]G~?[#x4;][#x0;][#x0;]??[#x12;]'