簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM