元素XML解析没有给出正确的结果

问题描述 投票:0回答:1

我有XML文件下面的示例,我正在尝试生成以下JSON,但我不打算预期结果它只在字典中添加一个文档。

Sample Input XML:
    <results status="passed">
        <num-records>2</num-records>
        <records>
            <volume-info>
                <flexible-volume-info>
                    <agg-name>aggr1_split</aggregate-name>
                </flexible-volume-info>
                <volume-name>volume1</volume-name>
                <volume-size>
                    <actual-size>44</actual-volume-size>
                    <afs-avail>90</afs-avail>
                </volume-size>
            </volume-info>
            <volume-info>
                <flexible-volume-info>
                    <agg-name>aggr2_split</aggregate-name>
                </flexible-volume-info>
                <volume-name>volume2</volume-name>
                <volume-size>
                    <actual-size>10</actual-volume-size>
                    <afs-avail>14</afs-avail>
                </volume-size>
            </volume-info>
        </records>
    </results>

预期输出:{“agg-name”:“aggr1_split”,“volume-name”:“volume1”,“actual-size”:“44”},{“agg-name”:“aggr2_split”,“volume-name “:”volume2“,”实际大小“:”10“}

Sample code:    
result = {}
for child in root.iter("records"):
    result['agg-name'] = child.find('volume-info/flexible-volume-info/agg-name').text
    result['volume-name'] = child.find('volume-info/volume-name').text
    result['actual-size'] = child.find('volume-info/volume-size/actual-size').text
print result
python xml
1个回答
0
投票

您的预期输出将是包含多个相同键的字典,这是不可能的。您需要为循环的每次迭代选择不同的键,或者更好的是还有一个词典列表:

import xml.etree.ElementTree as ET

xml_data = """<results status="passed">
    <num-records>2</num-records>
    <records>
        <volume-info>
            <flexible-volume-info>
                <agg-name>aggr1_split</agg-name>
            </flexible-volume-info>
            <volume-name>volume1</volume-name>
            <volume-size>
                <actual-size>44</actual-size>
                <afs-avail>90</afs-avail>
            </volume-size>
        </volume-info>
        <volume-info>
            <flexible-volume-info>
                <agg-name>aggr2_split</agg-name>
            </flexible-volume-info>
            <volume-name>volume2</volume-name>
            <volume-size>
                <actual-size>10</actual-size>
                <afs-avail>14</afs-avail>
            </volume-size>
        </volume-info>
    </records>
</results>"""

root = ET.fromstring(xml_data)


results = []

for child in root.iter("volume-info"):
    result = {}
    print(child)
    result['agg-name'] = child.find('flexible-volume-info/agg-name').text
    result['volume-name'] = child.find('volume-name').text
    result['actual-size'] = child.find('volume-size/actual-size').text

    results.append(result)

print(results)

这会给你:

[{'agg-name': 'aggr1_split', 'volume-name': 'volume1', 'actual-size': '44'}, {'agg-name': 'aggr2_split', 'volume-name': 'volume2', 'actual-size': '10'}]

您的XML也很糟糕,打开和关闭标记并不总是匹配。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.