XML spezielles Element auslesen

terravotion

Erfahrenes Mitglied
Hallo wieder ein Mal zu später Stunde.

Ich möchte ein XML File auslesen und die Daten spezifisch aussortieren:
Das Auslesen ist auch kein Problem, aber das Identifizieren eines spezifischen Elementes und das Auslesen des Inhaltes macht mir Mühe...

So etwa sieht das XML File aus:
Code:
<dict>
	<key>Name</key><string>Track 3</string>
	<key>Artist</key><string>INTERPRET</string>
	<key>Album</key><string>CDN</string>
	<key>Location</key><string>file://localhost/F:/.../Track%203.mp3</string>
</dict>

So sollte dsa etwa sein, einfach mal so in Pseudocode geschrieben =)
Code:
if(Element == "key" && Element.getContent() == "Name") {
    trackName = Element.getContent();
}
if(Element == "key" && Element.getContent() == "Artist") {
    trackArtist = Element.getContent();
}
if(Element == "key" && Element.getContent() == "Album") {
    trackAlbum = Element.getContent();
}
if(Element == "key" && Element.getContent() == "Location") {
    trackLocation = Element.getContent();
}

if(!file_exist(trackLocation)){
    Syso("Konnte nicht gefunden werden: " + trackArtist + " - " + trackAlbum + " - " + trackName);
}

Wie krieg ich das hin?

Und nun zum nächsten Problem...
Das kann sich ohne weiteres bis zu 20'000 Mal wiederholen. Und ich weiss jetzt nicht so Recht, ob das optimal ist oder ob sich das vereinfachen lässt.
 
Zuletzt bearbeitet:
Hallo!

Eine Möglichkeit wäre beispielsweise die Verwendung von XPath:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

/**
 * @author Thomas.Darimont
 * 
 */
public class XMLExample {
    public static void main(String[] args) throws Exception {
        XPath xpath = XPathFactory
                .newInstance()
                .newXPath();
        NodeList nodeList =
                (NodeList) xpath
                        .evaluate("/dicts/dict", new InputSource(new FileInputStream(
                                new File("data.xml"))), XPathConstants.NODESET);

        List<Dict> dicts = new ArrayList<Dict>();
        for (int i = 0, len = nodeList
                .getLength(); i < len; i++) {
            Node node = nodeList
                    .item(i);

            String name = xpath.evaluate("pair/key[text()=\"Name\"]/following-sibling::string/text()",node);
            String artist= xpath.evaluate("pair/key[text()=\"Artist\"]/following-sibling::string/text()",node);
            String album= xpath.evaluate("pair/key[text()=\"Album\"]/following-sibling::string/text()",node);
            String location= xpath.evaluate("pair/key[text()=\"Location\"]/following-sibling::string/text()",node);
            
            dicts.add(new Dict(name,artist,album,location));
        }
        
        System.out
                .println(dicts);

    }

    static class Dict {
        String name;

        String artist;

        String album;

        String location;

        public Dict(String name, String artist, String album, String location) {
            super();
            this.name = name;
            this.artist = artist;
            this.album = album;
            this.location = location;
        }

        /**
         * @return the album
         */
        public String getAlbum() {
            return album;
        }

        /**
         * @param album
         *           the album to set
         */
        public void setAlbum(String album) {
            this.album = album;
        }

        /**
         * @return the artist
         */
        public String getArtist() {
            return artist;
        }

        /**
         * @param artist
         *           the artist to set
         */
        public void setArtist(String artist) {
            this.artist = artist;
        }

        /**
         * @return the location
         */
        public String getLocation() {
            return location;
        }

        /**
         * @param location
         *           the location to set
         */
        public void setLocation(String location) {
            this.location = location;
        }

        /**
         * @return the name
         */
        public String getName() {
            return name;
        }

        /**
         * @param name
         *           the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
        
        @Override
        public String toString() {
            return "Name: " + getName() +" Artist: " + getArtist() + " Album: " + getAlbum() + " Location: " + getLocation();
        }

    }
}

Dass dazu passende XML Dokument:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<dicts>
    <dict>
        <pair>
            <key>Name</key>
            <string>Track 3</string>
        </pair>
        <pair>
            <key>Artist</key>
            <string>INTERPRET</string>
        </pair>
        <pair>
            <key>Album</key>
            <string>CDN</string>
        </pair>
        <pair>
            <key>Location</key>
            <string>file://localhost/F:/.../Track%203.mp3</string>
        </pair>
    </dict>
    <dict>
        <pair>
            <key>Name</key>
            <string>Track 4</string>
        </pair>
        <pair>
            <key>Artist</key>
            <string>INTERPRET X</string>
        </pair>
        <pair>
            <key>Album</key>
            <string>CDN X</string>
        </pair>
        <pair>
            <key>Location</key>
            <string>file://localhost/F:/.../Track%204.mp3</string>
        </pair>
    </dict>
</dicts>

Gruß Tom
 
Zuletzt bearbeitet von einem Moderator:
Herzlichen Dank vorerst!

Ich hab aber das Problem, dass ich das xml File nicht anpassen kann/darf/sollte. Es handelt sich nämlich um das XML File fürs iTunes. Und ich möchte eben gerne rausfinden, welche Tracks "falsch" gespeichert sind, resp. vom iTunes her nicht mehr lesbar.

Also hab ich versucht ein wenig an deinem Code zu feilen. Bei einem Eintrag im xml file, bisher alles perfekt =)

Aber ab 2 bringt es mir immer die Fehler:
Code:
[Fatal Error] :7:2: The markup in the document following the root element must be well-formed.
org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed.
	at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
	at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
	at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(Unknown Source)
	at Workaround.<init>(Workaround.java:28)
	at App.main(App.java:17)
--------------- linked to ------------------
javax.xml.xpath.XPathExpressionException
	at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(Unknown Source)
	at Workaround.<init>(Workaround.java:28)
	at App.main(App.java:17)
Caused by: org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed.
	at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
	at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
	... 3 more

Hier ein Aussschnit aus dem original XML File:
Code:
<dict>
...
  <dict>
   <key>1655</key>
     <dict>
	<key>Track ID</key><integer>16550</integer>
	<key>Name</key><string>one dance</string>
	<key>Artist</key><string>dj.ma_s-oul</string>
	<key>Album</key><string>Belive it or not</string>
	<key>Genre</key><string>House</string>
	<key>Kind</key><string>MPEG-Audiodatei</string>
	<key>Size</key><integer>7268396</integer>
	<key>Total Time</key><integer>454138</integer>
	<key>Track Number</key><integer>1</integer>
	<key>Date Modified</key><date>2005-08-17T23:13:40Z</date>
	<key>Date Added</key><date>2005-08-18T00:13:38Z</date>
	<key>Bit Rate</key><integer>128</integer>
	<key>Sample Rate</key><integer>44100</integer>
	<key>Play Count</key><integer>1</integer>
	<key>Play Date</key><integer>-1087790870</integer>
	<key>Play Date UTC</key><date>2005-08-18T00:20:26Z</date>
	<key>Persistent ID</key><string>85FEAD366079865C</string>
	<key>Track Type</key><string>File</string>
	<key>Location</key><string>file://localhost/.../one%20dance.mp3</string>
	<key>File Folder Count</key><integer>-1</integer>
	<key>Library Folder Count</key><integer>-1</integer>
    </dict>
   <key>1656</key>
     <dict>
          ...
  </dict>
</dict>

EDIT: Es geht jetzt! Hab das XML File nochmals vom Aufbau her angeschaut --> alles klar :)
thx
 
Zuletzt bearbeitet:
Hallo,

ich versuche mich gerade an dem selben Problem.

Ich möchte gerne die XML Datei von iTunes auslesen.
In dieser ist ein DocType angegeben und genau hier flieg ich immer auf die Schnauze.
Code:
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

Wenn ich allerdings die DocType aus der XML rausschmeiße, läuft alles wunderbar!

Hier mal mein Quellcode :

Code:
 public  void ReadXML() throws Exception {
	    	XPath xpath= XPathFactory.newInstance().newXPath();
	    	NodeList nodeList =(NodeList) xpath.evaluate("/plist/dict/dict", new InputSource(new FileInputStream( new File(filename))), XPathConstants.NODESET);
	    	
	    	List<Dict> dicts = new ArrayList<Dict>();
	    	
	    	for (int i = 0, len = nodeList.getLength(); i < len; i++) {
	    		Node node = nodeList.item(i);
	    		String location= xpath.evaluate("dicts/key[text()=\"Location\"]/following-sibling::string/text()",node);
	    		dicts.add(new Dict(location));
	    	}
	    }

Hat jemand vielleicht einen Tipp für mich, wie ich dieses Problem lösen kann?

Bin für jede Hilfe dankbar!

Gruß

Michelle85
 
Zuletzt bearbeitet:
Zurück