通过Python解析XML标记并使用xml.dom.minidom替换它

时间:2013-02-15 18:28:19

标签: python xml xml-parsing

我的XML文件test.xml包含以下标记

<?xml version="1.0" encoding="ISO-8859-1"?>
<AppName>
    <out>This is a sample output with <test>default</test> text </out>
<AppName>

我编写了一个python代码,直到现在才执行以下操作:

from xml.dom.minidom import parseString
list = {'test':'example'}
file = open('test.xml','r')
data = file.read()
file.close()
dom = parseString(data)
if (len(dom.getElementsByTagName('out'))!=0):
    xmlTag = dom.getElementsByTagName('out')[0].toxml()
    out = xmlTag.replace('<out>','').replace('</out>','')
    print out

以下程序的输出为This is a sample output with <test>default</test> text

您还会注意到我有一个定义了list = {'test':'example'}的列表。

我想检查列表中列出的标签是否会被替换为相应的值,否则为默认值。

在这种情况下,输出应为:

This is a sample output with example text

1 个答案:

答案 0 :(得分:1)

这会或多或少地做你想要的:

from xml.dom.minidom import parseString, getDOMImplementation

test_xml = '''<?xml version="1.0" encoding="ISO-8859-1"?>
<AppName>
    <out>This is a sample output with <test>default</test> text </out>
</AppName>'''

replacements = {'test':'example'}
dom = parseString(test_xml)
if (len(dom.getElementsByTagName('out'))!=0):
    xmlTag = dom.getElementsByTagName('out')[0]
    children =  xmlTag.childNodes
    text = ""
    for c in children:
        if c.nodeType == c.TEXT_NODE:
            text += c.data
        else:
            if c.nodeName in replacements.keys():
                text += replacements[c.nodeName]
            else: # not text, nor a listed tag
                text += c.toxml()
    print text

请注意,我使用replacements而不是list。在python术语中,它是一个字典,而不是一个列表,所以这是一个令人困惑的名称。它也是一个内置函数,所以你应该避免使用它作为名称。

如果你想要一个dom对象而不仅仅是文本,你需要采取不同的方法。