2016-09-22 73 views
2

對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] 

我想知道哪些Ids和值與哪個代碼一起使用。像詞典字典可能或者可能是一個DataFrame的列表,其中行索引是Id,列標題是Code。

例如

A456B = {山:12000,UTEM:53.2}
A786C = {山:5000,UTEM:無}

最後,我要使用的值養活的方程。

請注意,真正的xml文件在每個代碼中可能不包含相同數量的ID和值。另外,Id和Value可能不同於一個代碼段到另一個代碼段。

很抱歉,如果這個問題是基本的,或不清楚......我只是一直在做蟒一個月:/

回答

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'} 
+0

非常緊湊!在我的真正的XML文件上工作得很好。 TY! – cmj29607

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}}

這遍歷所有項目的標籤,併爲每一個,創建一個字典鍵指向的字典的id /值對。只有Id標籤不爲空時纔會創建一個id /數據對。

+0

此代碼適用於我的真實案例,並且易於閱讀和理解。 – cmj29607