【问题标题】:lxml iterparse with file fails带有文件的lxml iterparse失败
【发布时间】:2015-08-05 08:39:41
【问题描述】:

我正在运行一个 python 程序来从 XML 文件中获取一个子树。以下是我正在运行以从 tag 获取子树的代码。

示例文件:

<?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()

但是这段代码没有返回任何内容。

如果我运行与下面相同的代码,则输出符合预期:

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

如果可能,请提出解决方案。

【问题讨论】:

  • 你是在第一种情况下调用函数吗?你得到的输出是什么?
  • @anand 是的,我正在调用它.. 更新相同的问题!
  • 你在第一种情况下得到的输出是什么?
  • @AnandSKumar:我没有得到任何输出。我还尝试将 print "In loop" 放入定义的函数中。即使那没有被打印出来!!
  • 这不是完整的代码,是吗?您似乎在调用 xml_parse_new() ,但定义接受 self 参数。你确定你调用的是正确的方法吗?看起来该方法在某个类中。你能链接到或更新完整的代码吗?

标签: python xml-parsing lxml


【解决方案1】:

在您的 xml 中,您的元素 - &lt;context&gt; - 有一个命名空间 - '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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多