如何使用python使嵌套xml结构扁平化

如何使用python使嵌套xml结构扁平化,python,xml,Python,Xml,我有巨大嵌套结构的XML。 像这个 <root> <node1> <subnode1> <name1>text1</name1> </subnode1> </node1> <node2> <subnode2> <name2>text2</name2> </subnode2> </node2> <

我有巨大嵌套结构的XML。 像这个

<root>
 <node1>
  <subnode1>
    <name1>text1</name1>
  </subnode1>
 </node1>
 <node2>
  <subnode2>
     <name2>text2</name2>
  </subnode2>
 </node2>
</root>
我也试过使用
节点。append(element)
,但它也不起作用。它在末尾添加了元素,我得到了无穷循环。
任何帮助都值得感谢。

这里要提到几点:

首先,如果使用
XML.etree.Elementree
解析上面给出的XML文件,那么test
element.text不是None
总是返回
True
,因为在每个节点的末尾都有一个新行字符,因此,每个假定没有文本的节点中的文本总是有
\n
字符。另一种选择是使用<代码> LxM.EtRe.PARSE < /C> >使用<代码> LxM.EtRE。XMLParser < /C> >忽略下面的空白文本。 其次,在阅读时附加到树上是不好的。这段代码将给出无限循环的原因相同:

>>> a = [1,2,3,4]
>>> for k in a:
        a.append(5)
你可以在这里看到@Alex Martelli对这个问题的回答:关于这个问题

因此,您应该创建一个缓冲区XML树并相应地构建它,而不是在遍历它时修改树

from xml.etree import ElementTree as et
import pdb;

from lxml import etree

p = etree.XMLParser(remove_blank_text=True)
path = 'test.xml'
tr = et.parse(path, parser = p)
root = tr.getroot()

buffer = et.Element(root.tag);

for node in root.getchildren():
    bnode = et.Element(node.tag)
    for element in node.iter():
        #pdb.set_trace()
        if (element.text is not None):
            bnode.append(element)
            #node.extend(element)
    buffer.append(bnode)

et.dump(buffer)
样本运行和结果:

Chip chip@ 01:01:53@ ~: python stackoverflow.py
<root><node1><name1>text1</name1></node1><node2><name2>text2</name2></node2></root>
Chip Chip@01:01:53@~:python stackoverflow.py
文本1文本2

注意:您总是可以尝试使用python中的
lxml
包打印一个漂亮的XML树,这里有以下教程:因为我打印出来的树肉眼看起来非常可怕。

这里要提到几点:

首先,如果使用
XML.etree.Elementree
解析上面给出的XML文件,那么test
element.text不是None
总是返回
True
,因为在每个节点的末尾都有一个新行字符,因此,每个假定没有文本的节点中的文本总是有
\n
字符。另一种选择是使用<代码> LxM.EtRe.PARSE < /C> >使用<代码> LxM.EtRE。XMLParser < /C> >忽略下面的空白文本。 其次,在阅读时附加到树上是不好的。这段代码将给出无限循环的原因相同:

>>> a = [1,2,3,4]
>>> for k in a:
        a.append(5)
你可以在这里看到@Alex Martelli对这个问题的回答:关于这个问题

因此,您应该创建一个缓冲区XML树并相应地构建它,而不是在遍历它时修改树

from xml.etree import ElementTree as et
import pdb;

from lxml import etree

p = etree.XMLParser(remove_blank_text=True)
path = 'test.xml'
tr = et.parse(path, parser = p)
root = tr.getroot()

buffer = et.Element(root.tag);

for node in root.getchildren():
    bnode = et.Element(node.tag)
    for element in node.iter():
        #pdb.set_trace()
        if (element.text is not None):
            bnode.append(element)
            #node.extend(element)
    buffer.append(bnode)

et.dump(buffer)
样本运行和结果:

Chip chip@ 01:01:53@ ~: python stackoverflow.py
<root><node1><name1>text1</name1></node1><node2><name2>text2</name2></node2></root>
Chip Chip@01:01:53@~:python stackoverflow.py
文本1文本2

注意:您总是可以尝试使用python中的
lxml
包打印漂亮的XML树,这里有以下教程:因为我打印出来的树很难用肉眼阅读。

这很有帮助。非常感谢你!这很有帮助。非常感谢你!