如何在Python中从XML文件中过滤值
我对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']
希望这就是你想要的意思。