Python中的嵌套XML标记



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

<data>&lt;data1&gt;hello&lt;/data1&gt; 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",所以可以做的是遍历数据中的所有子节点并获取值。

相关内容

  • 没有找到相关文章

最新更新