Python中的嵌套XML标记

时间:2014-04-28 02:33:45

标签: python xml minidom

我有一个嵌套的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 &lt;data1&gt;hello&lt;/data1&gt; bar</data>

<data>&lt;data1&gt;hello&lt;/data1&gt; bar</data>

有什么方法可以创建它,使它看起来像原始的?谢谢。

3 个答案:

答案 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”,因此可以做的是迭代数据中的所有子节点并获取值。