Почему я получаю ошибку при переборе словаря - PullRequest
1 голос
/ 03 октября 2019

Я новичок в Python и пытаюсь понять, почему при переборе словаря, полученного из XML-файла, я получаю сообщение об ошибке, когда пытаюсь найти требуемые ключи. Я должен также упомянуть, что я все еще получаю результат, который яхочу, но каким-то образом я получаю сообщение об ошибке.

    import os
    import shelve
    import xml.etree.ElementTree as et

    shelfFile = shelve.open('xml_data')
    base_path = os.path.dirname(os.path.realpath(__file__))

    xml_file = os.path.join(base_path, "data\\nrm_icg_catalog.xml")

    tree = et.parse(xml_file)

    root = tree.getroot()

    elements = ['Name','WBS']

    for child in root:
        for itemGroup1 in child:
            for item in elements:
                print(itemGroup1.attrib[item])

Результат с сообщением об ошибке:

Facilitating Works
0
Substructure
1
Superstructure
2
Internal Finish
3
Fittings
4
Services
5
Prefabs
6
Works to Existing Building
7
External Works
8
MC Prelims
9
MC OH and P
10
Traceback (most recent call last):
  File "c:/Users/Dodzi Agbenorku/OneDrive/Training Files/Programming Lessons/Python/xmlExcel/app.py", line 22, in <module>
    print(itemGroup1.attrib[item])
KeyError: 'Name'

Вот небольшой фрагмент используемого мной xml-файла:

<?xml version="1.0" encoding="utf-8"?>
<Takeoff xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://download.autodesk.com/us/navisworks/schemas/nw-TakeoffCatalog-10.0.xsd">
    <Catalog>
        <ItemGroup Name="Facilitating Works" WBS="0" CatalogId="32b4ab2d-6fe8-4c45-9872-c8ea68c0c4de">
            <ItemGroup Name="Hazardous Materials" WBS="1" CatalogId="2fdb6bd1-b2d1-4167-a74d-da818183a156">
                <ItemGroup Name="Material Removal" WBS="1" CatalogId="ccc8a515-4152-400c-a72e-6fd78561325e">
                    <Item Name="Material Details" WBS="1" Transparency="0.3" Color="-15161029" LineThickness="0.1" CatalogId="c0a7de26-6bc3-491e-b3c7-3ff5b560eeaf">
                        <VariableCollection>
                            <Variable Name="Length" Formula="=ModelLength" Units="Meter" />
                            <Variable Name="Width" Formula="=ModelWidth" Units="Meter" />
                            <Variable Name="Thickness" Formula="=ModelThickness" Units="Meter" />
                            <Variable Name="Height" Formula="=ModelHeight" Units="Meter" />
                            <Variable Name="Perimeter" Formula="=ModelPerimeter" Units="Meter" />
                            <Variable Name="Area" Formula="=ModelArea" Units="SquareMeter" />

Буду очень признателен за любую помощь.

1 Ответ

1 голос
/ 03 октября 2019

Ошибка возникает из-за того, что для некоторых узлов Name отсутствует в attrib, который является словарем.

Вместо itemGroup1.attrib[item] используйте itemGroup1.attrib.get(item). Он вернет значение None, если ключ не существует, и не выдаст ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...