Python ElementTree支持解析未知的XML实体?

栏目: Python · 发布时间: 7年前

内容简介:http://stackoverflow.com/questions/7237466/python-elementtree-support-for-parsing-unknown-xml-entities

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

<Style name="admin-5678">
    <Rule>
      <Filter>[admin_level]='5'</Filter>
      &maxscale_zoom11;
    </Rule>
</Style>

http://effbot.org/elementtree/elementtree-xmlparser.htm 有一个诱人的提示,XMLParser有限的实体支持,但我找不到所提及的方法,一切都给出错误:

#!/usr/bin/python
    ##
    ## Where's the entity support as documented at:
    ## http://effbot.org/elementtree/elementtree-xmlparser.htm
    ## In Python 2.7.1+ ?
    ##
    from pprint     import pprint
    from xml.etree  import ElementTree
    from cStringIO  import StringIO

    parser = ElementTree.ElementTree()
   #parser.entity["maxscale_zoom11"] = unichr(160)
    testf = StringIO('<foo>&maxscale_zoom11;</foo>')
    tree = parser.parse(testf)
   #tree = parser.parse(testf,"XMLParser")
    for node in tree.iter('foo'):
        print node.text

这取决于你如何调整评论:

xml.etree.ElementTree.ParseError: undefined entity: line 1, column 5

要么

AttributeError: 'ElementTree' object has no attribute 'entity'

要么

AttributeError: 'str' object has no attribute 'feed'

对于那些好奇的XML,这是从 OpenStreetMap 的mapnik项目.

我不知道这是否是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并修复它在那里.

http://stackoverflow.com/questions/7237466/python-elementtree-support-for-parsing-unknown-xml-entities


以上所述就是小编给大家介绍的《Python ElementTree支持解析未知的XML实体?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

人月神话

人月神话

弗雷德里克.布鲁克斯 / UMLChina翻译组、汪颖 / 清华大学出版社 / 2007-9 / 48.00元

在软件领域,很少能有像《人月神话》一样具有深远影响力和畅销不衰的著作。Brooks博士为人们管理复杂项目提供了最具洞察力的见解,既有很多发人深省的观点,又有大量软件工程的实践。本书内容来自Brooks博士在IBM公司SYSTEM/360家族和OS/360中的项目管理经验,该项目堪称软件开发项目管理的典范。该书英文原版一经面世,即引起业内人士的强烈反响,后又译为德、法、日、俄、中、韩等多种文字,全球......一起来看看 《人月神话》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具