Python元素树支持解析未知的XML实体?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (51)

我有一组超级简单的XML文件来解析...但是...他们使用自定义的实体。我不需要将这些映射到角色,但我希望解析并针对每个角色进行操作。例如:

<Style name="admin-5678">
    <Rule>
      <Filter>[admin_level]='5'</Filter>
      &maxscale_zoom11;
    </Rule>
</Style>
提问于
用户回答回答于

我不确定这是ElementTree中的一个错误还是什么,但是你需要在expat分析器上调用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并修复它。

用户回答回答于

我们可以将一些XML定义预先添加到传入的原始HTML内容中,然后ElementTree可以开箱即用。

这适用于Python 2.6,2.7,3.3,3.4。

import xml.etree.ElementTree as ET

html = '''<html>
    <div>Some reasonably well-formed HTML content.</div>
    <form action="login">
    <input name="foo" value="bar"/>
    <input name="username"/><input name="password"/>

    <div>It is not unusual to see &nbsp; in an HTML page.</div>

    </form></html>'''

magic = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
            <!ENTITY nbsp ' '>
            ]>'''  # You can define more entities here, if needed

et = ET.fromstring(magic + html)

扫码关注云+社区

领取腾讯云代金券