当前位置: 首页 > 面试题库 >

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

桓兴腾
2023-03-14
问题内容

我有一组要解析的超简单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)来恢复过去的行为。

这有点hacky,但是您可以通过创建自己的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子类化并在那里进行修复。



 类似资料:
  • 我正在测试Hibernate@任何映射。但我面临一个问题:

  • 日安!< br >我正在试用corda版令牌SDK 1.1版,并希望尝试发行/兑换自定义可替换令牌的各种方案。 我编写了一个简单的流程,描述了参与方自身的令牌颁发:< br >虽然非常基本的流程看起来工作得很好,但是在子流程(IssueTokensFlow)中,尝试将PersistentFungibleToken保存到数据库(下面是堆栈跟踪)。我试图实现自己的模式,但没有成功,因为函数suppor

  • 问题内容: 我目前正在使用DOM解析器来解析XHTML文档,例如: 我的问题是,当我的文档包含一个实体引用时,例如: 我的解析器为包含“€”而不是“&euro;”的内容创建了一个Text节点。这就是说,它正在按预期的方式解析实体(XHTML 1.0 Strict DTD链接到ENTITIES Latin1 DTD,这反过来确定了“&euro;”与“€”的对等)。 问题是,我不希望解析器执行此类操作

  • 我有一个CXF WebClient,它尝试从REST服务读取XML请求。 我正在使用代码: 技能课程: System.out.println返回: 但我有个例外: 它似乎试图将技能解析为其他东西,其中似乎包含链接、nameUriPair和触发器。我没有这样的类。(我确实检查了导入,这是我的技能,而不是其他东西) 我在3.0.2和3.1.5版本中都尝试了以下工件 GroupID: 组织。阿帕奇。cx

  • 问题内容: 我正在尝试入门Hibernate 2nd Edition,而我一直试图将简单的工作示例与HSQLDB结合在一起。 当我跑步时,我得到 这是我得到的: Message.java PopulateMessages.java build.properties hibernate.cfg.xml build.xml 问题答案: 您的实体注释不正确, 必须 使用注释。您可以使用Hibernate

  • 问题内容: 我真的很想了解我的代码发生了什么。 我有一个独立的应用程序,它使用spring和Hibernate作为JPA,我正在尝试使用单个主类运行测试 我的主班 我的应用程序上下文是: 我的用户模型是: 我的DAO是: 这是我运行程序时出现的我的stacktrace错误: 问题答案: 您必须在会话工厂配置中列出您的类。如果使用,则可以自动发现实体。 为了在hibernate和spring中使用注