如何在python中过滤XML文件中的值

时间:2010-02-18 06:01:29

标签: python xml

我对XML和python有基本的掌握,并且一直在使用minidom取得了一些成功。我遇到了一种情况,我无法从XML文件中获取我想要的值。这是预先存在的文件的基本结构。

<localization>
    <b n="Stats">
        <l k="SomeStat1">
            <v>10</v>
        </l>
        <l k="SomeStat2">
            <v>6</v>
        </l>
    </b>
    <b n="Levels">
        <l k="Level1">
            <v>Beginner Level</v>
        </l>
        <l k="Level2">
            <v>Intermediate Level</v>
        </l>
    </b>
</localization>

大约有15个不同的<b>标签,里面有几十个孩子。我想做的是,如果给出一个级别编号(1),则找到相应级别的<v>节点。我根本不知道该怎么做。

5 个答案:

答案 0 :(得分:4)

您可以考虑使用XPATH,这是一种用于处理xml文档部分的语言。

以下是使用lxml.etree的答案,它支持xpath

>>> data = """
... <localization>
...     <b n="Stats">
...         <l k="SomeStat1">
...             <v>10</v>
...         </l>
...         <l k="SomeStat2">
...             <v>6</v>
...         </l>
...     </b>
...     <b n="Levels">
...         <l k="Level1">
...             <v>Beginner Level</v>
...         </l>
...         <l k="Level2">
...             <v>Intermediate Level</v>
...         </l>
...     </b>
... </localization>
... """
>>>
>>> from lxml import etree
>>>
>>> xmldata = etree.XML(data)
>>> xmldata.xpath('/localization/b[@n="Levels"]/l[@k=$level]/v/text()',level='Level1')
['Beginner Level']

答案 1 :(得分:2)

#!/usr/bin/python

from xml.dom.minidom import parseString

xml = parseString("""<localization>
    <b n="Stats">
        <l k="SomeStat1">
            <v>10</v>
        </l>
        <l k="SomeStat2">
            <v>6</v>
        </l>
    </b>
    <b n="Levels">
        <l k="Level1">
            <v>Beginner Level</v>
        </l>
        <l k="Level2">
            <v>Intermediate Level</v>
        </l>
    </b>
</localization>""")

level = 1
blist = xml.getElementsByTagName('b')
for b in blist:
    if b.getAttribute('n') == 'Levels':
        llist = b.getElementsByTagName('l')
        l = llist.item(level)
        v = l.getElementsByTagName('v')
        print v.item(0).firstChild.nodeValue;
        #prints Intermediate Level

答案 2 :(得分:1)

如果您真的只关心搜索具有特定“k”属性的<l>标记,然后获取其<v>标记(这就是我理解您的问题的方式),那么您可以使用DOM执行此操作:

from xml.dom.minidom import parseString

xmlDoc = parseString("""<document goes here>""")
lNodesWithLevel2 = [lNode for lNode in xmlDoc.getElementsByTagName("l")
                    if lNode.getAttribute("k") == "Level2"]

matchingVNodes = map(lambda lNode: lNode.getElementsByTagName("v"), lNodesWithLevel2)

print map(lambda vNode: vNode.firstChild.nodeValue, matchingVNodes)
# Prints [u'Intermediate Level']

这就是你的意思。

答案 3 :(得分:0)

level = "Level"+raw_input("Enter level number: ")
content= open("xmlfile").read()
data= content.split("</localization>")
for item in data:
    if "localization" in item:
        s = item.split("</b>")
        for i in s:
           if """<b n="Levels">""" in i:
                for c in i.split("</l>"):
                    if "<l" in c and level in c:
                         for v in c.split("</v>"):
                            if "<v>" in v:
                                print v[v.index("<v>")+3:]

答案 4 :(得分:0)

如果您可以使用BeautifulSoup库(不是吗?),您最终可能会得到这个简单的代码:

from BeautifulSoup import BeautifulStoneSoup

def get_it(xml, level_n):
    soup = BeautifulStoneSoup(xml)
    l = soup.find('l', k="Level%d" % level_n)
    return l.v.string

if __name__ == '__main__':
    print get_it(1)

它为您提供的示例XML打印Beginner Level