在Python中用ElementTree改变名称空间前缀

2024-06-08 06:15:19 发布

您现在位置:Python中文网/ 问答频道 /正文

默认情况下,当您调用ElementTree.parse(someXMLfile)时,Python ElementTree库会用Clark表示法中的名称空间URI作为每个解析节点的前缀:

    {http://example.org/namespace/spec}mynode

这使得在后面的代码中按名称访问特定节点成为一个巨大的痛苦。

我已经阅读了ElementTree和名称空间上的文档,看起来iterparse()函数应该允许我改变解析器给名称空间加前缀的方式,但就我的生命而言,实际上我不能让它改变前缀。这似乎可能发生在ns start事件之前的后台,甚至在本例中引发:

for event, elem in iterparse(source):
    if event == "start-ns":
        namespaces.append(elem)
    elif event == "end-ns":
        namespaces.pop()
    else:
        ...

如何更改前缀行为以及函数结束时返回的正确内容?


Tags: 函数名称event节点parse空间情况start
2条回答

您不需要特别使用iterparse。相反,以下脚本:

from cStringIO import StringIO
import xml.etree.ElementTree as ET

NS_MAP = {
    'http://www.red-dove.com/ns/abc' : 'rdc',
    'http://www.adobe.com/2006/mxml' : 'mx',
    'http://www.red-dove.com/ns/def' : 'oth',
}

DATA = '''<?xml version="1.0" encoding="utf-8"?>
<rdc:container xmlns:mx="http://www.adobe.com/2006/mxml"
                 xmlns:rdc="http://www.red-dove.com/ns/abc"
                 xmlns:oth="http://www.red-dove.com/ns/def">
  <mx:Style>
    <oth:style1/>
  </mx:Style>
  <mx:Style>
    <oth:style2/>
  </mx:Style>
  <mx:Style>
    <oth:style3/>
  </mx:Style>
</rdc:container>'''

tree = ET.parse(StringIO(DATA))
some_node = tree.getroot().getchildren()[1]
print ET.fixtag(some_node.tag, NS_MAP)
some_node = some_node.getchildren()[0]
print ET.fixtag(some_node.tag, NS_MAP)

产生

('mx:Style', None)
('oth:style2', None)

它显示了如何访问解析树中各个节点的完全限定标记名。你应该能够适应你的特殊需要。

根据文档,xml.etree.ElementTree似乎没有fixtag。不过,我已经看过fixtag的一些源代码,您可以这样做:

import xml.etree.ElementTree as ET

for event, elem in ET.iterparse(inFile, events=("start", "end")):
    namespace, looktag = string.split(elem.tag[1:], "}", 1)

looktag中有适合查找的标记字符串。命名空间在命名空间中。

相关问题 更多 >

    热门问题