[英]parse a section of an XML file with python
我是 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 和值与哪些代码对应。 像字典这样的东西可能或者可能是一个 DataFrame 列表,其中行索引是 Id,列标题是 Code。
例如
A456B = {山:12000,UTEM:53.2}
A786C = {山:5000,UTEM:无}
最终我想使用这些值来提供一个方程。
请注意,真实的 xml 文件可能不会在每个代码中包含相同数量的 ID 和值。 此外,Id 和 Value 可能因一个 Code 部分而异。
对不起,如果这个问题是基本的,或者不清楚......我只做了一个月的python:/
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'}
这可能是你想要的:
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 对的字典的字典键。 仅当 Id 标签不为空时,才会创建 id/data 对。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.