Я не уверен, является ли это ошибкой в ElementTree или чем-то, но вам нужно вызвать UseForeignDTD (True) в парсере экспатов, чтобы вести себя так, как это было в прошлом.
Это немного странно, но вы можете сделать это, создав собственный экземпляр ElementTree.Parser, вызвав метод для его экземпляра xml.parsers.expat и передав его в ElementTree.parse ():
from xml.etree import ElementTree
from cStringIO import StringIO
testf = StringIO('<foo>&moo_1;</foo>')
parser = ElementTree.XMLParser()
parser.parser.UseForeignDTD(True)
parser.entity['moo_1'] = 'MOOOOO'
etree = ElementTree.ElementTree()
tree = etree.parse(testf, parser=parser)
for node in tree.iter('foo'):
print node.text
Это выводит "MOOOOO"
Или используя интерфейс отображения:
from xml.etree import ElementTree
from cStringIO import StringIO
class AllEntities:
def __getitem__(self, key):
#key is your entity, you can do whatever you want with it here
return key
testf = StringIO('<foo>&moo_1;</foo>')
parser = ElementTree.XMLParser()
parser.parser.UseForeignDTD(True)
parser.entity = AllEntities()
etree = ElementTree.ElementTree()
tree = etree.parse(testf, parser=parser)
for node in tree.iter('foo'):
print node.text
Это выводит "moo_1"
Более сложным решением было бы создать подкласс ElementTree.XMLParser и исправить его там.