使用python解析XML文件的一部分

时间:2016-09-22 19:32:21

标签: python xml

我是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:/

2 个答案:

答案 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对。

相关问题