Как я могу извлечь все содержимое из всех элементов XML-файла с помощью Python и ElementTree?

#python #xml #elementtree

#python #xml #elementtree

Вопрос:

У меня есть следующий XML-файл, который называется Artists.xml , который содержит информацию о нескольких исполнителях, как показано ниже:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Artists>
<Singer name="Britney">
    <Albums>7</Albums>
    <Country>USA</County>
    <Last Single>  Piece of Me
      <Year>2011</Year>
   </Last Single>
</Singer>
<Singer name="Justin">
    <Albums>8</Albums>
    <Country>USA</County>
    <Last Single> Rock Your Body
      <Year>2004</Year>
   </Last Single>
</Singer>
</Artsts>
 

Я использую библиотеку Python ElementTree для извлечения содержимого всех тегов. Пока это код Python, который я написал:

 from xml.etree import cElementTree as ET
tree = ET.parse('Artists.xml')
root = tree.getroot()
for child in root:
    for content in child:
       print(child[content].text)
 

Несмотря на это, когда я запускаю скрипт, я не вижу никаких входных данных в своей консоли. Я хотел бы увидеть что-то вроде: 7 USA Piece of Me 2011, 8 USA Rock Your Body 2004. может кто-нибудь помочь мне понять, что я делаю неправильно? Заранее спасибо!

Комментарии:

1. Ваш xml неправильно отформатирован.

2. Пользователь ElementTree.iterparse

Ответ №1:

используя xml.etree.ElementTree

test.xml:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Artists>
    <Singer name="Britney">
        <Albums>7</Albums>
        <Country>USA</Country>
        <LastSingle>
               Piece of Me
              <Year>2011</Year>
       </LastSingle>
    </Singer>
    <Singer name="Justin">
        <Albums>8</Albums>
        <Country>USA</Country>
        <LastSingle> Rock Your Body
          <Year>2004</Year>
       </LastSingle>
    </Singer>
</Artists>
 

Следовательно:

 from xml.etree import ElementTree
tree = ElementTree.parse('test.xml')
root = tree.getroot()
results = root.findall('Singer')

for elem in results:
    for e in elem:
        print(e.text.strip())
 

ВЫВОД:

 7
USA
Piece of Me
8
USA
Rock Your Body

Process finished with exit code 0
 

Комментарии:

1. Привет, спасибо за ваш ответ! Что, если у меня большой документ, и я все еще хочу, чтобы все содержимое было напечатано, но не знаю, какой дочерний узел содержится в корне дерева?

Ответ №2:

Общий подход. Преобразуйте XML в dict и распечатайте dict. (Файл 55726013.xml содержит ваши примерные данные). Как вы можете видеть, код не имеет никаких знаний о структуре XML.

 import xmltodict
import json

with open('55726013.xml') as fd:
    doc = xmltodict.parse(fd.read())

print(json.dumps(doc, indent=4))
 

Вывод

 {
    "Artists": {
        "Singer": [
            {
                "@name": "Britney", 
                "Albums": "7", 
                "Country": "USA", 
                "LastSingle": {
                    "Year": "2011", 
                    "#text": "Piece of Me"
                }
            }, 
            {
                "@name": "Justin", 
                "Albums": "8", 
                "Country": "USA", 
                "LastSingle": {
                    "Year": "2004", 
                    "#text": "Rock Your Body"
                }
            }
        ]
    }
}