Разбор XML-файла в Python 2.x - PullRequest
       0

Разбор XML-файла в Python 2.x

0 голосов
/ 22 декабря 2018

У меня есть XML-файл songs.xml, который частично показан ниже:

<?xml version="1.0" encoding="utf-8"?>
<Event status="happened">
<Song title="Erase and rewind">
<Artist name="The Cardigans" ID="340900">
</Artist>
<Info StartTime="22:22:13" JazlerID="8310" 
 PlayListerID="" />
</Song>
</Event>

Мне нужно проанализировать такой файл и получить все поля, такие как: Название песни: Исполнитель: Время начала: ID:

Я пытаюсь что-то вроде этого, но я получаю только название каждой песни:

#!/usr/bin/python
from xml.dom.minidom import parse
import xml.dom.minidom

# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("songs.xml")
Event  = DOMTree.documentElement
if Event.hasAttribute("happened"):
   print "Root element : %s" % collection.getAttribute("happened")

# Get all the songs in the collection
songs = Event.getElementsByTagName("Song")
x = Event.getElementsByTagName("*").length
print x

# Print detail of each song.
for song in songs:
   print "*****Song*****"
   if song.hasAttribute("title"):
      print "Title: %s" % song.getAttribute("title")

Мне нужно это, чтобы сохранить их позже в БД. Спасибо

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Окончательный ответ, который отвечает моим потребностям, основанный на предложении RoadRunners, следующий:

import xml.etree.ElementTree as ET

tree = ET.parse('songs1.xml')
root = tree.getroot()


for child in root:
    #print(child.tag, child.attrib)
    #print(child.attrib.get("title"))


    print(child.attrib.get("title"))

    for x in child:
        if x.tag == "Artist":
            print(x.tag)
            #print(dic_artist)
            dic_artist = x.attrib
            print(dic_artist.get("name"))
            print(dic_artist.get("ID"))
        if x.tag == "Info":
            print(x.tag)
            #print(dic_info)
            dic_info = x.attrib
            print(dic_info.get("StartTime"))
            print(dic_info.get("JazlerID"))
            #print(dic_info.get("PlayListerID"))
    print("-------------------------------")
0 голосов
/ 22 декабря 2018

Вы можете использовать xml.etree.ElementTree для анализа XML-файлов:

import xml.etree.ElementTree as ET

tree = ET.parse('songs.xml')
root = tree.getroot()

for child in root:
    print(child.tag, child.attrib)

    for x in child:
        print(x.tag, x.attrib)

Что выводит на печать:

Song {'title': 'Erase and rewind'}
Artist {'name': 'The Cardigans', 'ID': '340900'}
Info {'StartTime': '22:22:13', 'JazlerID': '8310', 'PlayListerID': ''}

Где теги XML печатаются наслева, а данные, хранящиеся в словарях, напечатаны справа.Вы можете получить доступ к данным из этих словарей.

Если вы хотите напечатать только значения, которые не являются None или пустой строкой, вы можете попробовать это:

import xml.etree.ElementTree as ET 

tree = ET.parse('songs.xml') 
root = tree.getroot() 

for child in root:
    title = child.attrib.get("title")
    if title:
        print('title = %s' % title)

    for x in child:
        for key in x.attrib:
            value = x.attrib.get(key)
            if value:
                print(key, "=", value)

Что дает:

title = Erase and rewind
name = The Cardigans
ID = 340900
StartTime = 22:22:13
JazlerID = 8310
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...