python - 使用有序字典解析 xml 文件

标签 python xml dictionary xml-parsing xmltodict

我有一个 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"]

关于python - 使用有序字典解析 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26926426/

相关文章:

python - 在 Linux 上安装 pyodbc 失败

c# - 解析具有相同父节点和子节点名称的 XML

在for循环中具有三个值的Python dict

python - 使用 python mechanize 填充 <noscripts> 标签内的 textarea

python - 如何将这两个图像与 python numpy 和 opencv 合并?

python - 如何使用 python 将变量从 .mat 文件(由 Dymola 生成)导出到 .csv

java - 迭代英语词典所有单词的来源

java - 如何使用 Java 解析 XML?

c# - 从 PostAsync() 读取 XML 响应

dictionary - 在 Parquet 中的 map 类型列上使用 spark-sql 过滤下推