如何在Python中从XML文件中过滤值

1 投票
5 回答
4979 浏览
提问于 2025-04-15 19:25

我对XML和Python有一些基础了解,之前用minidom处理XML文件还算顺利。但现在遇到一个问题,就是我无法从一个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 个回答

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
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

如果你只是想找一个带有特定“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']

希望这就是你想要的意思。

撰写回答