5

xmlの形式のファイルがあります。

<NewDataSet>
    <Root>
        <Phonemic>and</Phonemic>
        <Phonetic>nd</Phonetic>
        <Description/>
        <Start>0</Start>
        <End>8262</End>
    </Root>
    <Root>
        <Phonemic>comfortable</Phonemic>
        <Phonetic>comfetebl</Phonetic>
        <Description>adj</Description>
        <Start>61404</Start>
        <End>72624</End>
    </Root>
</NewDataSet>

たとえば、ユーザーが を入力すると、プログラムがタグとnd照合してパーツから戻るように処理する必要があります。xml ファイルを辞書に変換できれば、データを反復処理して、必要に応じて情報を見つけることができるのではないかと考えました。<Phonetic>and<Phonemic>

同じ目的で使用されるxmltodictを検索して見つけました。

import xmltodict
with open(r'path\to\1.xml', encoding='utf-8', errors='ignore') as fd:
    obj = xmltodict.parse(fd.read())

これを実行すると、次のようになりますordered dict

>>> obj
OrderedDict([('NewDataSet', OrderedDict([('Root', [OrderedDict([('Phonemic', 'and'), ('Phonetic', 'nd'), ('Description', None), ('Start', '0'), ('End', '8262')]), OrderedDict([('Phonemic', 'comfortable'), ('Phonetic', 'comfetebl'), ('Description', 'adj'), ('Start', '61404'), ('End', '72624')])])]))])

残念ながら、これは物事を簡単にするものではなく、新しいデータ構造でプログラムを実装する方法がわかりません。たとえば、アクセスするndには、次のように書く必要があります。

obj['NewDataSet']['Root'][0]['Phonetic']

これはとてつもなく複雑です。通常の辞書にしようとしましたdict()が、ネストされているため、内部のレイヤーは順序付けられたままになり、データが非常に大きくなります。

4

3 に答える 3

0

Muの答えは私にとってはうまくいきました。私が変更しなければならなかった唯一のことは、root_elementが常にリストステップであることを確認することでした.

import xmltodict
from collections import OrderedDict

xmldata = """<NewDataSet>
    <Root>
        <Phonemic>and</Phonemic>
        <Phonetic>nd</Phonetic>
        <Description/>
        <Start>0</Start>
        <End>8262</End>
    </Root>
    <Root>
        <Phonemic>comfortable</Phonemic>
        <Phonetic>comfetebl</Phonetic>
        <Description>adj</Description>
        <Start>61404</Start>
        <End>72624</End>
    </Root>
</NewDataSet>"""

obj = xmltodict.parse(xmldata)
obj = obj["NewDataSet"]
root_elements = obj["Root"] if type(obj["Root"]) == list else [obj["Root"]] 
# Above step ensures that root_elements is always a list
# Is obj["Root"] a list already, then use obj["Root"], otherwise make single element list.
for element in root_elements:
    print element["Phonetic"]
于 2016-12-03T14:14:09.110 に答える