lxml忽略具有未定义的名称空间前缀的元素

时间:2012-08-27 13:16:57

标签: python namespaces iterator lxml

我有一些简单的代码单步执行大型XML文件(包含在DTD中定义的实体):

from lxml import etree
tree = etree.parse(
    file('t.xml', 'r'), etree.XMLParser(dtd_validation=False, load_dtd=True))
for e in tree.iter('bla'):
    process(e)  # whatever to be done with it

这适用于纯XML输入。

不幸的是,iter生成器不会为带有冒号(名称空间前缀)的标记产生任何内容。命名空间没有在任何地方定义,实际上我并不关心它。我只想迭代这些元素。

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:1)

嗯,这可能不完全令人满意,但这是我发现的:

>>> root = tree.getroot()
>>> root.attrib
{'{http://www.w3.org/2001/XMLSchema-instance}schemaLocation': 'http://xmlns.oracle.com/weblogic/security/xacml'}
>>> root.nsmap
{None: 'http://xmlns.oracle.com/weblogic/domain', 'wls': 'http://xmlns.oracle.com/weblogic/security/wls', 'sec': 'http://xmlns.oracle.com/weblogic/security', 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'}
>>> 

用于标记:

<domain xmlns="http://xmlns.oracle.com/weblogic/domain"
    xmlns:sec="http://xmlns.oracle.com/weblogic/security"
    xmlns:wls="http://xmlns.oracle.com/weblogic/security/wls"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.oracle.com/weblogic/security/xacml">

但这应该可以让你得到一切:

    通过attrib
  • “标准”属性
  • “namespace”通过nsmap