我有一些简单的代码单步执行大型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
生成器不会为带有冒号(名称空间前缀)的标记产生任何内容。命名空间没有在任何地方定义,实际上我并不关心它。我只想迭代这些元素。
有一种简单的方法吗?
答案 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
nsmap