0

我有一些简单的代码单步执行一个大型 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生成器不会为带有冒号的标签生成任何东西(命名空间前缀)。命名空间没有在任何地方定义,实际上我并不关心它。我只想遍历元素。

是否有捷径可寻?

4

1 回答 1

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
  • “命名空间”通过nsmap
于 2012-08-28T08:29:33.173 回答