0

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

4 回答 4

3
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>
"""
于 2011-03-28T15:57:31.860 回答
2

如果您添加wt=python到请求参数,Solr 可以返回 Python 字典。要将此文本响应转换为 Python 对象,请使用ast.literal_eval(text_response).

这比解析 XML 简单得多。

于 2011-08-22T06:56:08.270 回答
1

使用 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数据插入另一个字典,当然可以,但是你需要为那个字典选择一个合适的键。例如,使用idPython 为每个对象提供的功能,您可以编写:

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

于 2011-03-28T11:24:56.707 回答
0

将来自外部的任何字符串直接评估为 python 是有风险的。谁知道里面有什么。

我建议使用 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)
于 2013-11-01T15:22:19.273 回答