Python+;Expat:on&;上的错误#0; 实体

Python+;Expat:on&;上的错误#0; 实体,python,xml,parsing,elementtree,expat-parser,Python,Xml,Parsing,Elementtree,Expat Parser,我编写了一个小函数,它使用ElementTree和xpath提取xml文件中某些元素的文本内容: #!/usr/bin/env python2.5 import doctest from xml.etree import ElementTree from StringIO import StringIO def parse_xml_etree(sin, xpath): """ Takes as input a stream containing XML and an XPath expr

我编写了一个小函数,它使用ElementTree和xpath提取xml文件中某些元素的文本内容:

#!/usr/bin/env python2.5

import doctest
from xml.etree import ElementTree
from StringIO import StringIO

def parse_xml_etree(sin, xpath):
  """
Takes as input a stream containing XML and an XPath expression.
Applies the XPath expression to the XML and returns a generator
yielding the text contents of each element returned.

>>> parse_xml_etree(
...   StringIO('<test><elem1>one</elem1><elem2>two</elem2></test>'),
...   '//elem1').next()
'one'
>>> parse_xml_etree(
...   StringIO('<test><elem1>one</elem1><elem2>two</elem2></test>'),
...   '//elem2').next()
'two'
>>> parse_xml_etree(
...   StringIO('<test><null>&#0;</null><elem3>three</elem3></test>'),
...   '//elem2').next()
'three'
"""

  tree = ElementTree.parse(sin)
  for element in tree.findall(xpath):
    yield element.text  

if __name__ == '__main__':
  doctest.testmod(verbose=True)
。。。屈服

xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, column 12
但在我的特殊情况下,我并不需要XPath解析,我可以使用BeautifulSoup本身及其解析的树.test.elem1.contents[0]
&0不在XML规范定义的范围内。唉,我的Python技能相当初级,因此我在这方面没有多少帮助。

&0不是有效的XML字符。理想情况下,您可以让文件的创建者更改其流程,这样文件就不会像这样无效

如果必须接受这些文件,您可以对它们进行预处理,将
转换为其他文件。例如,选择@作为转义字符,将“@”变为“@@”,将“
�;
”变为“@0”


然后,当您从解析器获得文本数据时,您可以反转映射。这只是一个例子,你可以发明任何你喜欢的转义语法。

Hm,是的,规范非常清楚。谢谢你的准确参考。我知道这是一个旧的线程,但规范中说什么文字字符可能只出现在XML中。字节序列�;不是一个空字符,而是一个表示空字节的4字符序列。鉴于这种区别,它是�;合法的我在规范中找不到任何说明这是非法的。这是一个有效的问题。但答案是这样的:“使用字符引用引用的字符必须与字符的生成相匹配。”在我的特殊情况下,我可以删除它们。它们位于XML的一个无关元素中。虽然使用文本处理来处理XML感觉不太可靠,但由于它的格式不好,我想我别无选择。。。使用某种标记汤解析器似乎有些过分。您确定转义算法是健壮的吗?难道你不需要考虑XML语法中的特征的优先级吗?
xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, column 12