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',
    }

私は辞書がどのように機能するかについてあまり詳しくありませんが、すべての「ドキュメント」を1つの辞書にまとめる方法もあります。

乾杯。

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はもちろん可能ですが、そのディクショナリに適したキーを選択する必要があります。たとえば、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。これは実行ごとに変化する可能性があります。

于 2011-03-28T11:24:56.707 に答える