我有一个嵌套的XML,如下所示:
<data>foo <data1>hello</data1> bar</data>
我正在使用minidom,但无论我如何尝试获取&#34;数据&#34;之间的值,我只能得到&#34; foo&#34;但不是&#34; bar&#34;
如果XML是这样的话会更糟:
<data><data1>hello</data1> bar</data>
我只得到一个&#34;无&#34;,根据上面的逻辑,这是正确的。所以我来到这里:http://levdev.wordpress.com/2011/07/29/get-xml-element-value-in-python-using-minidom并得出结论认为这是由于minidom的限制?
所以我在那个博客中使用了这个方法,现在我得到了
foo <data1>hello</data1> bar
和
<data1>hello</data1> bar
这是可以接受的。但是,如果我尝试使用上面的输出作为节点值创建一个新节点(createTextNode),那么XML将变为:
<data>foo <data1>hello</data1> bar</data>
和
<data><data1>hello</data1> bar</data>
有什么方法可以创建它,使它看起来像原始的?谢谢。
答案 0 :(得分:2)
您可以使用元素树对于xml,它非常有效地检索和创建节点
查看下面的链接
element tree - tutorials mixed xml
创建节点
的一些示例import xml.etree.ElementTree as ET
data = ET.Element('data')
data1= ET.SubElement(data, 'data1',attr="value")
data1.text="hello"
data.text="bar"
data1.tail="some code"
ET.dump(data)
输出:<data>bar<data1 attr="value">hello</data1>some code</data>
答案 1 :(得分:0)
使用以下函数来美化你的xml,这样很容易看到......首先......
import xml.dom.minidom as minidom
def prettify(elem):
"""Return a pretty-printed XML string for the Element. Props goes
to Maxime from stackoverflow for this code."""
rough_string = et.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent="\t")
这使得在视觉上踩到树更加简单。
接下来我建议修改你的xml,这会让你的生活变得更轻松。
而不是:
<data>foo
<data1>hello</data1>
bar
</data>
这不是正确的XML格式我会将'foo'和'bar'保存为
的属性它看起来像这样:
<data var1='foo' var2='bar'>
<data1>hello</data1>
</data>
使用xml.etree.ElementTree执行此操作:
import xml.etree.ElementTree as ET
data = ET.Element('data', {'var1:'foo', 'var2':'bar'})
data1= ET.SubElement(data, 'data1')
data1.text='hello'
print prettify(data)
答案 2 :(得分:0)
所以在@pandubear指出之后,XML:
<data>foo <data1>hello</data1> bar</data>
有两个文本节点,包含“foo”和“bar”,因此可以做的是迭代数据中的所有子节点并获取值。