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

У меня есть следующий 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. Может ли кто-нибудь помочь мне понять, что я делаю неправильно?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Общий подход.Конвертируйте 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"
                }
            }
        ]
    }
}
0 голосов
/ 17 апреля 2019

с использованием 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())

OUTPUT

7
USA
Piece of Me
8
USA
Rock Your Body

Process finished with exit code 0
...