将Solr XML解析为Python字典

2024-10-01 15:44:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我需要把它变成一本字典,它看起来像:

^{pr2}$

我不太熟悉字典的工作原理,但有没有办法把所有的“文档”都放进一本字典里。在

干杯。在


Tags: 实例name文档addfielddoc字典xml
3条回答

使用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,可以编写:

^{pr2}$

这个例子的目的就是让您了解如何使用外部字典。如果您决定沿着这条路径走,我建议您找到一个有意义的、可用的键,而不是id返回的obejct的内存地址,该地址可以在不同的运行之间变化。在

如果向请求参数添加wt=python,Solr可以返回一个Python字典。要将此文本响应转换为Python对象,请使用^{}。在

这比解析XML要简单得多。在

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)

输出

^{pr2}$

其中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>
"""

相关问题 更多 >

    热门问题