2016-09-22 3 views
2

Im новый как для python, так и для xml. Посмотрите на предыдущие сообщения по этой теме, и я не могу понять, как делать именно то, что мне нужно. Хотя в принципе это довольно просто.проанализировать раздел XML-файла с помощью python

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

Все, что я хочу сделать, это извлечь все коды, значения и идентификаторы, что не представляет проблемы.

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] 

Я хочу знать, какие идентификаторы и значения идут с кодом. Возможно, что-то вроде словаря словарей или, возможно, списка DataFrames с индексом строки, являющимся Id, а заголовок столбца - кодом.

, например

A456B = {гора: 12000, ЮТЭЙ: 53,2}
A786C = {гора: 5000, ЮТЭЙ: Нет}

В конце концов, я хочу использовать значение кормить уравнение.

Обратите внимание, что настоящий xml-файл не может содержать одинаковое количество идентификаторов и значений в каждом коде. Кроме того, 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-файлах. ти! – 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}}

This перебирает все теги Пункт, и для каждого из них, создает ключ, указывающий Dict в Словаре пар id/value. Пара id/data создается только в том случае, если тег Id не пуст.

+0

Этот код хорошо работает на моих реальных случаях, и его легко читать и понимать. – cmj29607

Смежные вопросы