2016-09-22 13 views
2

Imは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と値が使用されるか知りたいのですが。辞書の辞書のようなもの、あるいは行インデックスがIDであるDataFramesのリスト、そして列ヘッダーはCodeです。例えば

A456B = {山:12000、UTEM:53.2}
A786C = {山:5000、UTEM:なし}

結局私は式を養うために値を使用します。

実際のxmlファイルには、各コードに同じ数のIdと値が含まれないことがあります。また、IdとValueはコードセクションごとに異なる場合があります。この質問は基本、または不明である場合

申し訳ありませんが...私は一ヶ月のためのpythonを行ってきた:/

答えて

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ファイルでうまく動作します。タイ! – cmj29607

0

これは、あなたが望むものであるかもしれない: {'A456B' : {'mountain' : '12000', 'UTEM' : '53.2'}, 'A786C' : {'mountain' : '5000', 'UTEM' : None}}

すべての項目タグの上にこの繰り返し処理を、それぞれ1のために、辞書に辞書のキーポインティングを作成します。

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 

これは、生産しますIDと値のペアのid/dataペアは、Idタグが空でない場合にのみ作成されます。

+0

このコードは私の実際のケースでうまく機能し、読みやすく、理解しやすいものです。 – cmj29607

関連する問題