我是python和xml的新手。看过以前关于这个主题的帖子,我无法弄清楚如何做到我需要的东西。虽然原则上似乎很简单。
<Project>
<Items>
<Item>
<Code>A456B</Code>
<Database>
<Data>
<Id>mountain</Id>
<Value>12000</Value>
</Data>
<Data>
<Id>UTEM</Id>
<Value>53.2</Value>
</Data>
</Database>
</Item>
<Item>
<Code>A786C</Code>
<Database>
<Data>
<Id>mountain</Id>
<Value>5000</Value>
</Data>
<Data>
<Id>UTEM</Id>
<Value></Value>
</Data>
</Database>
</Item>
</Items>
</Project>
我想要做的就是提取所有代码,值和ID,这没问题。
import xml.etree.cElementTree as ET
name = 'example tree.xml'
tree = ET.parse(name)
root = tree.getroot()
codes=[]
ids=[]
val=[]
for db in root.iter('Code'):
codes.append(db.text)
for ID in root.iter('Id'):
ids.append(ID.text)
for VALUE in root.iter('Value'):
val.append(VALUE.text)
print codes
print ids
print val
['A456B', 'A786C']
['mountain', 'UTEM', 'mountain', 'UTEM']
['12000', '53.2', '5000', None]
我想知道哪些ID和值与哪些代码一致。像词典字典可能是OR或者是一个DataFrames列表,其中行索引是Id,列标题是Code。
例如
A456B = {mountain:12000,UTEM:53.2}
A786C = {mountain:5000,UTEM:None}
最终我想使用值来提供方程式。
请注意,真实的xml文件可能在每个代码中不包含相同数量的ID和值。此外,Id和Value可能会从一个Code部分到另一个部分不同。
很抱歉,如果这个问题是基本的,或者不清楚......我只做了一个月的python:/
答案 0 :(得分:1)
BeautifulSoup是一个非常有用的解析HTML和XML的模块。
from bs4 import BeautifulSoup
import os
# read the file into a BeautifulSoup object
soup = BeautifulSoup(open(os.getcwd() + "\\input.txt"))
results = {}
# parse the data, and put it into a dict, where the values are dicts
for item in soup.findAll('item'):
# assemble dicts on the fly using a dict comprehension:
# http://stackoverflow.com/a/14507637/4400277
results[item.code.text] = {data.id.text:data.value.text for data in item.findAll('data')}
>>> results
{u'A786C': {u'mountain': u'5000', u'UTEM': u''},
u'A456B': {u'mountain': u'12000', u'UTEM': u'53.2'}
答案 1 :(得分:0)
这可能是你想要的:
import xml.etree.cElementTree as ET
name = 'test.xml'
tree = ET.parse(name)
root = tree.getroot()
codes={}
for item in root.iter('Item'):
code = item.find('Code').text
codes[code] = {}
for datum in item.iter('Data'):
if datum.find('Value') is not None:
value = datum.find('Value').text
else:
value = None
if datum.find('Id') is not None:
id = datum.find('Id').text
codes[code][id] = value
print codes
这会产生:
{'A456B' : {'mountain' : '12000', 'UTEM' : '53.2'}, 'A786C' : {'mountain' : '5000', 'UTEM' : None}}
迭代所有Item标签,并为每个标签创建一个指向id / value对的dict的dict键。仅当Id标记不为空时才会创建id / data对。