我有一个嵌套的XML,如下所示:
<data>foo <data1>hello</data1> bar</data>
我正在使用minidom,但无论我如何尝试获取"数据"之间的值,我都只能获得"foo",而不能获得"bar"
如果XML是这样的,情况会更糟:
<data><data1>hello</data1> bar</data>
我只得到一个"无",根据上面的逻辑,这是正确的。所以我遇到了这个:http://levdev.wordpress.com/2011/07/29/get-xml-element-value-in-python-using-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>
有没有什么方法可以让它看起来像原作?非常感谢。
您可以使用元素树For xml,它对节点的检索和创建都非常有效
看看下面的链接
元素树--教程混合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>
使用以下函数对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"one_answers"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)
所以在@panddubear指出之后,XML:
<data>foo <data1>hello</data1> bar</data>
确实有两个文本节点,包含"foo"one_answers"bar",所以可以做的是遍历数据中的所有子节点并获取值。