如何使用python使嵌套xml结构扁平化
我有巨大嵌套结构的XML。 像这个如何使用python使嵌套xml结构扁平化,python,xml,Python,Xml,我有巨大嵌套结构的XML。 像这个 <root> <node1> <subnode1> <name1>text1</name1> </subnode1> </node1> <node2> <subnode2> <name2>text2</name2> </subnode2> </node2> <
<root>
<node1>
<subnode1>
<name1>text1</name1>
</subnode1>
</node1>
<node2>
<subnode2>
<name2>text2</name2>
</subnode2>
</node2>
</root>
我也试过使用节点。append(element)
,但它也不起作用。它在末尾添加了元素,我得到了无穷循环。
任何帮助都值得感谢。这里要提到几点: 首先,如果使用
XML.etree.Elementree
解析上面给出的XML文件,那么testelement.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文件,那么testelement.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树,这里有以下教程:因为我打印出来的树很难用肉眼阅读。这很有帮助。非常感谢你!这很有帮助。非常感谢你!