2
<dict>
<key>1208</key>
        <dict>
            <key>Track ID</key><integer>1208</integer>
            <key>Name</key><string>Kings And Queens</string>
            <key>Artist</key><string>30 Seconds To Mars</string>
            <key>Album Artist</key><string>30 Seconds to Mars</string>
            <key>Composer</key><string>Jared Leto</string>
            <key>Album</key><string>This Is War</string>
            <key>Genre</key><string>Pop</string>
            <key>Kind</key><string>MPEG audio file</string>
            <key>Size</key><integer>10634388</integer>
            <key>Total Time</key><integer>347820</integer>
            <key>Track Number</key><integer>1</integer>
            <key>Year</key><integer>2009</integer>
            <key>Date Modified</key><date>2011-09-05T21:03:08Z</date>
            <key>Date Added</key><date>2011-08-18T03:57:19Z</date>
            <key>Bit Rate</key><integer>244</integer>
            <key>Sample Rate</key><integer>44100</integer>
            <key>Comments</key><string> 00000000 00000210 000006F0 0000000000EA0000 00000000 00A22291 00000000 00000000 00000000 00000000 00000000 00000000</string>
            <key>Play Count</key><integer>1</integer>

        <key>Play Date</key><integer>3399116673</integer>
            <key>Play Date UTC</key><date>2011-09-17T09:34:33Z</date>
            <key>Persistent ID</key><string>BB3D5E86F5CAC255</string>
            <key>Track Type</key><string>File</string>
            <key>Location</key><string>file://localhost/D:/My%20Music/English%20songs/01-30_seconds_to_mars-kings_and_queens.mp3</string>
            <key>File Folder Count</key><integer>-1</integer>
            <key>Library Folder Count</key><integer>-1</integer>
        </dict>

...

..

I want to use xml.dom.minidom package to parse this file.

self.dom = xml.dom.minidom.parse(self.file)
self.name = self.dom.getElementsByTagName('dict')
print self.name[10].firstChild.data

This code does not seem to work. Basically what I want is to check the value of the second child of dict and then if it is the track I want get the location of the track.

Is there a way to get the dict node which satisfies my conditions?

4
  • Is that correct that you have two levels of nesting where 'dict' can appear? Then the "getElementsByTagName" won't work. Commented Sep 18, 2011 at 7:32
  • Yes there 2 levels of dict. but there is a plist element on top of <dict> can the plist element be used ? Commented Sep 18, 2011 at 7:42
  • If you have full control over the naming of the elements, I'd strongly recommend using less generic names than dict and key first. :) Commented Sep 18, 2011 at 7:57
  • @jellybean: I suspect he doesn't have control over the naming of the elements. This looks to me like a snippet of the iTunesMusicLibrary.xml file that iTunes generates. Commented Sep 18, 2011 at 8:05

1 Answer 1

3

How about:

import xml.dom.minidom as minidom
dom = minidom.parse('test.xml')
data={}
for dct in dom.getElementsByTagName('dict'):
    keys=dct.getElementsByTagName('key')
    # key.nextSibling can be an integer or string or date element, or Text node
    # key.nextSibling.firstChild is a Text node or None
    vals=[key.nextSibling.firstChild for key in keys]
    # drill down to the text inside the keys and vals
    keys=[key.firstChild.data for key in keys]
    vals=[val.data if val else None for val in vals]
    data=dict(zip(keys,vals))
    if data['Track ID']=='1208':
        print(data['Location'])
        break

which yields

file://localhost/D:/My%20Music/English%20songs/01-30_seconds_to_mars-kings_and_queens.mp3
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.