Мой Python неправильно читает XML - PullRequest
1 голос
/ 09 июля 2019

Вот мой код Python для доступа к XML-файлу:

import xml.etree.ElementTree as ET

def display_book(book):

    root = ET.parse(source="library.xml")

    info = root.iter("catalog")

    for elem in info:
        name = elem.find("book").attrib['id']

        if name == book:
            print(name)

    return "Book Not Found"

#Main
display_book("bk105")

Вот пример кода XML:

<catalog>
    <book id="bk101">
        <author>Gambardella, Matthew</author>
        <title>XML Developer's Guide</title>
        <genre>Computer</genre>
        <price>44.95</price>
        <publish_date>2000-10-01</publish_date>
        <description>
              An in-depth look at creating applications with XML.
        </description>
    </book>
    <book id="bk102">
        <author>Ralls, Kim</author>
        <title>Midnight Rain</title>
        <genre>Fantasy</genre>
        <price>5.95</price>
        <publish_date>2000-12-16</publish_date>
        <description>
              A former architect battles corporate zombies, an evil sorceress,                         
              and her own childhood to become queen of the world.
        </description>
    </book>
</catalog>

Книги идут от "bk101" до "bk112", и код только находит идентификатор "bk101" в качестве первой книги, а не перебирает все идентификаторы каждой книги и перекрестно ссылается на нее с вводом, поэтому программа никогда не выводит что-нибудь. Даже «Книга не найдена».

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Вы можете переключиться на использование findall:

import xml.etree.ElementTree as ET

def display_book():

    root = ET.parse(source="library.xml")

    info = root.iter("catalog")

    for elem in info:
        books = elem.findall("book")
        for book in books:
            print book.attrib['id']


# Main
display_book()
1 голос
/ 09 июля 2019

elem.find("book") возвращает только первую книгу в каталоге.Вам нужно использовать elem.findall("book"), а затем перебирать их.

Но вы можете просто использовать root.iter("book"), чтобы перебирать книги напрямую.

for elem in root.iter("book"):
    name = elem.attrib('id')
    if name == book:
        print(name)
else:
    print("Book not found")

Вы должны также поставить ошибкусообщение в блоке else:.В противном случае он будет возвращен, даже если книга найдена.

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