带有文件的 lxml iterparse 失败
lxml iterparse with file fails
我正在 运行 宁 python 程序从 XML 文件中获取子树。以下是我 运行 从标签中获取子树的代码。
示例文件:
<?xml version="1.0" encoding="utf-8"?>
<nc:data xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
<system xmlns="abc.org">
<context>
<name>context_1</name>
<host>
<name>Name_Node</name>
<tag1>
<name>ABC</name>
<tag2>PQR</tag2>
</tag1>
</host>
</context>
</system>
</nc:data>
和 iterparse 函数
class xml_file_generation:
def xml_parse_new(self):
for event, elem in ET.iterparse('sample.xml', events=events, tag="context"):
print "In loop"
print ET.tostring(elem)
print("%s" % (elem.tag))
elem.close()
test = xml_file_generation()
test.xml_parse_new()
但是这段代码returns没有显示。
如果我 运行 与下面相同的代码,输出如预期的那样:
xml = '''\
<root>
<element key='value'>text</element>
<element>text</element>tail
<empty-element xmlns="testns" />
<testtag>abc</testtag>
</root>
'''
events = ("start", "end")
context = ET.iterparse(StringIO(xml), events=events, tag='testtag')
for action, elem in context:
print action, elem.tag
print elem.text
如果可能,请提出解决方案。
在您的 xml 中,您的元素 - <context>
- 有一个命名空间 - 'abc.org'
,它从其父元素获取。在这种情况下,在 tag
参数中指定标记名时,您还需要指定命名空间。
不是真的,确定你所说的 elem.close()
是什么意思,但是删除它,Element
没有方法 close()
。
试试下面的例子 -
class xml_file_generation:
def xml_parse_new(self):
for event, elem in ET.iterparse('a.xml', events=events, tag="{abc.org}context"):
print("In loop")
print(ET.tostring(elem))
print("%s" % (elem.tag))
test = xml_file_generation()
test.xml_parse_new()
我正在 运行 宁 python 程序从 XML 文件中获取子树。以下是我 运行 从标签中获取子树的代码。
示例文件:
<?xml version="1.0" encoding="utf-8"?>
<nc:data xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
<system xmlns="abc.org">
<context>
<name>context_1</name>
<host>
<name>Name_Node</name>
<tag1>
<name>ABC</name>
<tag2>PQR</tag2>
</tag1>
</host>
</context>
</system>
</nc:data>
和 iterparse 函数
class xml_file_generation:
def xml_parse_new(self):
for event, elem in ET.iterparse('sample.xml', events=events, tag="context"):
print "In loop"
print ET.tostring(elem)
print("%s" % (elem.tag))
elem.close()
test = xml_file_generation()
test.xml_parse_new()
但是这段代码returns没有显示。
如果我 运行 与下面相同的代码,输出如预期的那样:
xml = '''\
<root>
<element key='value'>text</element>
<element>text</element>tail
<empty-element xmlns="testns" />
<testtag>abc</testtag>
</root>
'''
events = ("start", "end")
context = ET.iterparse(StringIO(xml), events=events, tag='testtag')
for action, elem in context:
print action, elem.tag
print elem.text
如果可能,请提出解决方案。
在您的 xml 中,您的元素 - <context>
- 有一个命名空间 - 'abc.org'
,它从其父元素获取。在这种情况下,在 tag
参数中指定标记名时,您还需要指定命名空间。
不是真的,确定你所说的 elem.close()
是什么意思,但是删除它,Element
没有方法 close()
。
试试下面的例子 -
class xml_file_generation:
def xml_parse_new(self):
for event, elem in ET.iterparse('a.xml', events=events, tag="{abc.org}context"):
print("In loop")
print(ET.tostring(elem))
print("%s" % (elem.tag))
test = xml_file_generation()
test.xml_parse_new()