我对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>
节点。我根本不知道该怎么做。
答案 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
。