用有序字典解析xml文件

奥米德

我有一个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,程序会将其与<Phonetic>标签匹配and<Phonemic>零件返回我想也许我可以将xml文件转换成字典,则可以遍历数据并在需要时查找信息。

我搜索并找到了用于相同目的的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()但是由于嵌套,内层仍然保持有序,并且我的数据很大。

没事

如果您以obj['NewDataSet']['Root'][0]['Phonetic']IMO的身份访问此文件,则说明操作不正确。

相反,您可以执行以下操作

obj = obj["NewDataSet"]
root_elements = obj["Root"] if type(obj) == OrderedDict else [obj["Root"]] 
# Above step ensures that root_elements is always a list
for element in root_elements:
    print element["Phonetic"]

即使这段代码看起来更长一些,但好处是一旦开始处理足够大的xml,它将变得更加紧凑和模块化。

PS:我也有同样的问题xmltodict但是,与其使用xml.etree.ElementTree进行语法分析来解析xml文件,不如使用xmltodict来简化工作,因为代码库较小,而且我不必处理xml模块的其他缺点。

编辑

以下代码对我有用

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) == OrderedDict else [obj["Root"]] 
# Above step ensures that root_elements is always a list
for element in root_elements:
    print element["Phonetic"]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章