Разбор Solr XML в словарь Python - PullRequest
0 голосов
/ 28 марта 2011

Я новичок в python и пытаюсь передать XML-документ (заполненный документами для экземпляра Solr) в словарь Python.У меня возникли проблемы, пытаясь на самом деле добиться этого.Я пытался использовать ElementTree и minidom, но я не могу получить правильные результаты.

Вот моя XML-структура:

<add>
    <doc>
        <field name="genLatitude">45.639968</field>
        <field name="carOfficeHoursEnd">2000-01-01T09:00:00.000Z</field>
        <field name="genLongitude">5.879745</field>
    </doc>
    <doc>
        <field name="genLatitude">46.639968</field>
        <field name="carOfficeHoursEnd">2000-01-01T09:00:00.000Z</field>
        <field name="genLongitude">6.879745</field>
    </doc>
</add>

И из этого мне нужно превратить его всловарь, который выглядит следующим образом:

doc {
    "genLatitude": '45.639968',
    "carOfficeHoursEnd": '2000-01-01T09:00:00.000Z',
    "genLongitude": '5.879745',
    }

Я не слишком знаком с тем, как работают словари, но есть ли способ собрать все "документы" в один словарь.

ура.

Ответы [ 4 ]

3 голосов
/ 28 марта 2011
import xml.etree.cElementTree as etree
from pprint import pprint

root = etree.fromstring(xmlstr) # or etree.parse(filename_or_file).getroot()

docs = [{f.attrib['name']: f.text for f in doc.iterfind('field[@name]')}
        for doc in root.iterfind('doc')]
pprint(docs)

Выход

[{'carOfficeHoursEnd': '2000-01-01T09:00:00.000Z',
  'genLatitude': '45.639968',
  'genLongitude': '5.879745'},
 {'carOfficeHoursEnd': '2000-01-01T09:00:00.000Z',
  'genLatitude': '46.639968',
  'genLongitude': '6.879745'}]

Где xmlstr:

xmlstr = """
<add>
    <doc>
        <field name="genLatitude">45.639968</field>
        <field name="carOfficeHoursEnd">2000-01-01T09:00:00.000Z</field>
        <field name="genLongitude">5.879745</field>
    </doc>
    <doc>
        <field name="genLatitude">46.639968</field>
        <field name="carOfficeHoursEnd">2000-01-01T09:00:00.000Z</field>
        <field name="genLongitude">6.879745</field>
    </doc>
</add>
"""
2 голосов
/ 22 августа 2011

Solr может вернуть словарь Python, если вы добавите wt=python к параметрам запроса.Чтобы преобразовать этот текстовый ответ в объект Python, используйте ast.literal_eval(text_response).

Это намного проще, чем синтаксический анализ XML.

1 голос
/ 28 марта 2011

Возможное решение, использующее ElementTree, с выводом, довольно форматированным для примера:

>>> import xml.etree.ElementTree as etree
>>> root = etree.parse(document).getroot()
>>> docs = []
>>> for doc in root.findall('doc'):
...   fields = {}
...   for field in doc:
...     fields[field.attrib['name']] = field.text
...   docs.append(fields)
... 
>>> print docs
[{'genLongitude': '5.879745',
  'genLatitude': '45.639968',
  'carOfficeHoursEnd': '2000-01-01T09:00:00.000Z'},
 {'genLongitude': '6.879745',
  'genLatitude': '46.639968',
  'carOfficeHoursEnd': '2000-01-01T09:00:00.000Z'}]

Показанный вами XML-документ не предоставляет способа отличить каждый doc от другого, поэтому я быутверждаю, что список - это лучшая структура для сбора каждого словаря.

Действительно, если вы хотите вставить все doc данные в другой словарь, конечно, вы можете, но вам нужно выбрать подходящий ключ для этого.толковый словарь.Например, используя id Python для каждого объекта, вы можете написать:

>>> docs = {}
>>> for doc in root.findall('doc'):
...   fields = {}
...   for field in doc:
...     fields[field.attrib['name']] = field.text
...   docs[id(fields)] = fields
... 
>>> print docs
{3076930796L: {'genLongitude': '6.879745',
               'genLatitude': '46.639968',
               'carOfficeHoursEnd': '2000-01-01T09:00:00.000Z'},
 3076905540L: {'genLongitude': '5.879745',
               'genLatitude': '45.639968',
               'carOfficeHoursEnd': '2000-01-01T09:00:00.000Z'}}

Этот пример предназначен просто для того, чтобы вы увидели, как использовать внешний словарь.Если вы решите пойти по этому пути, я бы посоветовал вам найти значимый и пригодный для использования ключ вместо адреса памяти объекта, возвращаемого id, который может меняться от запуска к запуску.

0 голосов
/ 01 ноября 2013

Рисовать любую строку, которая поступает извне прямо в питон, рискованно.Кто знает, что там.

Я бы предложил использовать интерфейс json.Что-то вроде:

import json
import urllib2

response_dict = json.loads(urllib2.urlopen('http://localhost:8080/solr/combined/select?wt=json&q=*&rows=1').read())

#to view the dict
print json.dumps(answer, indent=1)
...