从 xml 中提取索引数据时出现问题

Issues indexing data extract from xml

提问人:PracticingPython 提问时间:6/3/2021 最后编辑:PracticingPython 更新时间:6/11/2021 访问量:58

问:

我正在处理一些最终将加载到 csv 中的 XML 数据。当条目中不存在元素时,我在正确索引数据时遇到了问题。下面是我正在使用的一个简单的 xml 示例

<root>
    <entry>
        <LASTNAME>Doe</LASTNAME>
        <FIRSTNAME>Jon</FIRSTNAME>
        <GENDER>M</GENDER>
    </entry>
    <entry>
        <LASTNAME>Doe</LASTNAME>
        <FIRSTNAME>Jane</FIRSTNAME>
        <GENDER>F</GENDER>
        <HAIRCOLOR>Blonde</HAIRCOLOR>
    </entry>
</root>

我最终得到的输出如下:

姓氏 名字 染发剂
母鹿 John M 金发
母鹿 F

但正确的输出应该是:

姓氏 名字 染发剂
母鹿 John M
母鹿 F 金发

所以我似乎有一个索引问题,在搜索 HAIRCOLOR(取决于页面上存在的 HAIRCOLOR 元素的数量)的前几次,它会沿着 XML 向下移动,直到找到一个,但当它到达条目末尾时它应该停止。

这是我正在使用的代码:

import xml.etree.ElementTree as ET
from xml.etree.ElementTree import ParseError
from xml.etree import ElementTree


bytes_ = '''
<root>
    <entry>
        <LASTNAME>Doe</LASTNAME>
        <FIRSTNAME>Jon</FIRSTNAME>
        <GENDER>M</GENDER>
    </entry>
    <entry>
        <LASTNAME>Doe</LASTNAME>
        <FIRSTNAME>Jane</FIRSTNAME>
        <GENDER>F</GENDER>
        <HAIRCOLOR>Blonde</HAIRCOLOR>
    </entry>
</root>
'''
xpaths = [
    "./entry/LASTNAME",
    "./entry/FIRSTNAME",
    "./entry/GENDER",
    "./entry/HAIRCOLOR"
]

data = []

_fields = [
        {'text' : ''},
        {'text' : ''},
        {'text' : ''},
        {'text' : ''}
        ]

root = ET.fromstring(bytes_)


    for count in range(0,len(root.findall("./entry"))):
        
        for ele, xpath in enumerate(xpaths):
            try:
                attribs = list(root.findall(xpath)[count].attrib.keys())
                
                for attrib in attribs:
                    for i in _fields[ele].keys():
                
                        if attrib == i:
                            _fields[ele][i] = root.findall(xpath)[count].attrib[attrib]
                _fields[ele]["text"] =root.findall(xpath)[count].text
                

            except IndexError:
                _fields[ele]["text"]=''

            data.append(_fields[ele].values())
            data_list = [item for sublist in data for item in sublist]
        data.clear()
        print(data_list)

任何帮助都是值得赞赏的。

为清楚起见,进行了编辑

python xml

评论

0赞 PracticingPython 6/3/2021
我在 OP 中添加了其他细节。如果我能提供任何其他细节,请告诉我。
0赞 PracticingPython 6/3/2021
进行了更多编辑。代码按原样运行。

答:

-1赞 DisappointedByUnaccountableMod 6/3/2021 #1

您的 xpath 将匹配 HAIRCOLOR 标签,无论它在哪里,即任何地方。您需要首先找到每个条目,然后为每个条目查找 HAIRCOLOR 和条目中的其他标签。目前,您正在查找子标签。’./entry/HAIRCOLOR’’./entry’root

评论

0赞 PracticingPython 6/3/2021
谢谢你的建议。我最终通过您的评论意识到通过删除所有“/entry”来修改我的 xpath 列表。后来进行了其他一些小的修改以适应变化,一切都很好用。