# Kurze XML Datei Parsen



## killer3d (3. Jun 2011)

Guten Tag, 

nach dem mir hier so wunderbar geholfen wurde, wollte ich mal nach einem kleinen Code-Snippet fragen.

Ich suche ein Snippet welches mir diese XML Datei Ausliest. Ambesten so das ich die jehweilige Stadt in ein Objekt speichern kann.

Ich habe eine Klasse City welche die Methoden "setLon, setLat und setName" besitzt.

Meine XML Datei sieht so aus:
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<citys>
	<city>
		<name>Höxter</name>
		<lat>51.77476571883416</lat>
		<lon>9.374427795410156</lon>
	</city>
	<city>
		<name>Beverungen</name>
		<lat>51.6682540966346</lat>
		<lon>9.37459945678711</lon>
	</city>
	<city>
		<name>Borgentreich</name>
		<lat>51.57155379957614</lat>
		<lon>9.240102767944336</lon>
	</city>
</citys>
[/XML]

Ich möchte daraus eine List mit den City Objekten machen.

Ich hoffe ihr habt was zur Hand.

Mit freundlichen Grüßen
Dennis

p.s. ich möchte nur einen Codesnippet und keine dicke erklärung


----------



## eRaaaa (3. Jun 2011)

killer3d hat gesagt.:


> Ich hoffe ihr habt was zur Hand.



Kommt drauf an, welche Bibliothek benutzt du denn? 
javax.xml ?
JDOM?
...?


```
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		Document document = builder.parse(DEIN_XMLFILE_HERE);
		XPathExpression expr = XPathFactory.newInstance().newXPath().compile("//city");
		NodeList nodes = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
		List<City> cities = new ArrayList<City>();
		for (int i = 0; i < nodes.getLength(); i++) {
			NodeList n = nodes.item(i).getChildNodes();
			City city = new City();
			for (int j = 0; j < n.getLength(); j++) {
				Node node = n.item(j);
				if(node.getNodeType() == Node.ELEMENT_NODE){
					if(node.getNodeName().equals("name")){
						city.setName(node.getTextContent().trim());
					}else if(node.getNodeName().equals("lat")){
						city.setLat(Double.parseDouble(node.getTextContent().trim()));
					}else if(node.getNodeName().equals("lon")){
						city.setLon(Double.parseDouble(node.getTextContent().trim()));
					}
				}
			}
			cities.add(city);
		}
```

:bae:


----------



## killer3d (3. Jun 2011)

genau das habe ich gesucht, vielen dank, funktioniert wunderbar


----------



## ska3k (14. Jun 2011)

Ich habs soeben auch versucht, doch bekomm ich die Exception: 

[Fatal Error] :1:1: Content is not allowed in prolog.
org.xml.sax.SAXParseException: Content is not allowed in prolog.
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:249)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
	at test.View.readXMLFile(View.java:161)
	at test.View.createPartControl(View.java:91)
	at org.eclipse.ui.internal.ViewReference.createPartHelper(ViewReference.java:375)
	at org.eclipse.ui.internal.ViewReference.createPart(ViewReference.java:226)
	at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:599)
	at org.eclipse.ui.internal.PartPane.setVisible(PartPane.java:318)
	at org.eclipse.ui.internal.ViewPane.setVisible(ViewPane.java:542)
	at org.eclipse.ui.internal.presentations.PresentablePart.setVisible(PresentablePart.java:185)
	at org.eclipse.ui.internal.presentations.util.PresentablePartFolder.select(PresentablePartFolder.java:265)
	at org.eclipse.ui.internal.presentations.util.LeftToRightTabOrder.select(LeftToRightTabOrder.java:64)
	at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation.selectPart(TabbedStackPresentation.java:479)
	at org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:1262)
	at org.eclipse.ui.internal.PartStack.setSelection(PartStack.java:1215)
	at org.eclipse.ui.internal.PartStack.showPart(PartStack.java:1614)
	at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:659)
	at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:585)
	at org.eclipse.ui.internal.PartSashContainer.createControl(PartSashContainer.java:573)
	at org.eclipse.ui.internal.PerspectiveHelper.activate(PerspectiveHelper.java:269)
	at org.eclipse.ui.internal.Perspective.onActivate(Perspective.java:980)
	at org.eclipse.ui.internal.WorkbenchPage.onActivate(WorkbenchPage.java:2627)
	at org.eclipse.ui.internal.WorkbenchWindow$26.run(WorkbenchWindow.java:3077)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:66)
	at org.eclipse.ui.internal.WorkbenchWindow.setActivePage(WorkbenchWindow.java:3058)
	at org.eclipse.ui.internal.WorkbenchWindow.busyOpenPage(WorkbenchWindow.java:763)
	at org.eclipse.ui.internal.Workbench$19.runWithException(Workbench.java:1267)
	at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:32)
	at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:207)
	at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:150)
	at org.eclipse.swt.widgets.Display.syncExec(Display.java:1053)
	at org.eclipse.ui.internal.StartupThreading.runWithWorkbenchExceptions(StartupThreading.java:55)
	at org.eclipse.ui.internal.Workbench.busyOpenWorkbenchWindow(Workbench.java:1263)
	at org.eclipse.ui.internal.Workbench.doOpenFirstTimeWindow(Workbench.java:2062)
	at org.eclipse.ui.internal.Workbench.openFirstTimeWindow(Workbench.java:1993)
	at org.eclipse.ui.internal.WorkbenchConfigurer.openFirstTimeWindow(WorkbenchConfigurer.java:188)
	at org.eclipse.ui.application.WorkbenchAdvisor.openWindows(WorkbenchAdvisor.java:790)
	at org.eclipse.ui.internal.Workbench$28.runWithException(Workbench.java:1641)
	at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:32)
	at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:207)
	at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:150)
	at org.eclipse.swt.widgets.Display.syncExec(Display.java:1053)
	at org.eclipse.ui.internal.StartupThreading.runWithoutExceptions(StartupThreading.java:110)
	at org.eclipse.ui.internal.Workbench.init(Workbench.java:1636)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2655)
	at org.eclipse.ui.internal.Workbench.access$5(Workbench.java:2530)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:702)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:685)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:157)
	at test.Application.createUI(Application.java:17)
	at org.eclipse.rwt.internal.lifecycle.EntryPointManager.createUI(EntryPointManager.java:73)
	at org.eclipse.rwt.internal.lifecycle.RWTLifeCycle.createUI(RWTLifeCycle.java:211)
	at org.eclipse.rwt.internal.lifecycle.RWTLifeCycle$UIThreadController.run(RWTLifeCycle.java:88)
	at java.lang.Thread.run(Thread.java:680)
	at org.eclipse.rwt.internal.lifecycle.UIThread.run(UIThread.java:102)


Der Java-Code sieht so aus:


```
String filename = System.getProperty("user.home")+"/Desktop/daten.xml";
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document document = builder.parse(new InputSource( new StringReader( filename ) ));
        XPathExpression expr = XPathFactory.newInstance().newXPath().compile("//item");
        NodeList nodes = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
        List<DVDItem> dvditems = new ArrayList<DVDItem>();
        for (int i = 0; i < nodes.getLength(); i++) {
            NodeList n = nodes.item(i).getChildNodes();
            DVDItem dvd = new DVDItem();
            for (int j = 0; j < n.getLength(); j++) {
                Node node = n.item(j);
                if(node.getNodeType() == Node.ELEMENT_NODE){
                    if(node.getNodeName().equals("id")){
                    	dvd.setId(node.getTextContent().trim());
                    }else if(node.getNodeName().equals("titel")){
                    	dvd.setTitel(node.getTextContent().trim());
                    }else if(node.getNodeName().equals("laenge")){
                    	dvd.setLaenge(node.getTextContent().trim());
                    }else if(node.getNodeName().equals("erschienen")){
                    	dvd.setErschienen(node.getTextContent().trim());
                    }
                }
            }
            dvditems.add(dvd);
        }
```


Die XML ist die folgende:

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<dvd>
	<item>
		<id>1</id>
		<title>A-Team</title>
		<laenge>120 Minuten</laenge>
		<erschienen>2010</erschienen>
	</item>
	<item>
		<id>2</id>
		<title>Fast Furious Five</title>
		<laenge>122 Minuten</laenge>
		<erschienen>2010</erschienen>
	</item>
	<item>
		<id>3</id>
		<title>Pries</title>
		<laenge>87 Minuten</laenge>
		<erschienen>2011</erschienen>
	</item>
	<item>
		<id>4</id>
		<title>Thor</title>
		<laenge>115 Minuten</laenge>
		<erschienen>2011</erschienen>
	</item>
</dvd>
[/XML]

Wo liegt mein Fehler?

Gruß ska3k


----------



## eRaaaa (14. Jun 2011)

Ähm 
	
	
	
	





```
builder.parse(new InputSource( new StringReader( filename ) ));
```
das ist sicherlich nicht das was du meintest  
Du übergibst dem StringReader jetzt den String filenname, was jetzt für ihn dann der XMLString sein müsste und nicht der Pfad!
Probiere stattdessen mal

```
builder.parse(new File(filename) );
```


----------



## ska3k (14. Jun 2011)

Dankeschööön


----------

