# XML Datei in Java parsen JDOM



## danielandross (21. Juni 2007)

Hallo, ich möchte in java XML Daten einlesen. Beim ersten Element schaffe ich das auch, sollte aber alle einlesen können.
Ausschnitt aus der XML Datei (alle Einträge heißen Entity):

```
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE tutorial SYSTEM "tutorialNeu.dtd">

<Root>
	<Entity>
		<Extension>DOC</Extension>
		<Optional>
			<Category>Document</Category>
			<Description>Word10Office2000File</Description>
		</Optional>
		<Segment>
			<SegmentHeader>D0CF11E0A1B11AE1</SegmentHeader>
			<SegmentOffset>0</SegmentOffset>
		</Segment>
	</Entity>

	<Entity>
		<Extension>XML</Extension>
		<Optional>
			<Category>Document</Category>
			<Description>MSExcelXMLDocument</Description>
		</Optional>
		<Segment>
			<SegmentHeader>3C3F786D6C</SegmentHeader>
			<SegmentOffset>0</SegmentOffset>
		</Segment>
	</Entity>
</Root>
```

Mein Code bisher: (mit dem iterator bin ich bis jetzt gescheitert aber so kann man wie gesagt auf jeden fall die erste Entity auslesen)


```
SAXBuilder sxbuild = new SAXBuilder();
  InputSource is = new InputSource("d:\\saddsad.xml");
  org.jdom.Document doc;
  org.jdom.Element root;
	try {
		doc = sxbuild.build(is);
		//Lesen des Wurzelelements des JDOM-Dokuments doc
		root = doc.getRootElement();
	} catch (IOException e) {
		e.printStackTrace();
		return;
	}   
	catch (JDOMException e) {
		e.printStackTrace();
		return;
	}   
	while(root.getChildren().listIterator().hasNext()){
		org.jdom.Element entityElement=root.getChild("Entity");
		org.jdom.Element extensionElement=entityElement.getChild("Extension");
		System.out.println(extensionElement.getValue());
		root.getChildren().listIterator().next();
	}
```


----------



## danielandross (22. Juni 2007)

Vielleicht sollte ich das Problem nochmal konkretisieren:
Mein XMl File hat ja Datensätze die alle Entity heißen. Ich möchte alle dieser Datensätze auslesen, das Problem ist, dass 
	
	
	



```
root.getChild("Entity");
```
 mir immer das erste "Entity" zurück gibt und folglich auch in einer Endlosschleife endet. Wie kann ich ihn also dazu bringen jeden Tag mit dem Namen Entity genau einmal auszulesen?


----------



## MeinerEiner_80 (22. Juni 2007)

Moin!
Erstmal als Tip: Da es sich hier eher um eine Java Frage handelt, hätte sie ins Java Forum besser gepasst.. Hättest du vielleicht auch schneller Antwort bekommen..

Zu deinem Problem:
In der while Schleife erstellst du jedes Mal einen neuen Iterator. Ergo, liest du nur immer das erste Element aus.
Und mit root.getChild("Entinty") würdest du dir auch nur immer das erste Entinty Element des Root Knotens holen..

"Vielleichst" solltest du es besser mal so probieren:

```
Iterator iter = root.getChildren().iterator();
        while(iter.hasNext()){
            Element entityElement = (Element)iter.next();
            Element extensionElement=entityElement.getChild("Extension");
            System.out.println(extensionElement.getValue());
            
        }
```

*grüssle*
MeinerEiner


----------



## KlaDi (22. Juni 2007)

Hallo,

so läufts:
	
	
	



```
SAXBuilder sxbuild = new SAXBuilder();
		InputSource is = new InputSource("c:\\test.xml");
		org.jdom.Document doc;
		org.jdom.Element root;
		try {
			doc = sxbuild.build(is);
			//Lesen des Wurzelelements des JDOM-Dokuments doc
			root = doc.getRootElement();
		} catch (IOException e) {
			e.printStackTrace();
			return;
		}   
		catch (JDOMException e) {
			e.printStackTrace();
			return;
		}   
		for(int i = 0; i < root.getChildren().size(); i++) {
			org.jdom.Element ele = (Element) root.getChildren().get(i);
			System.out.println(ele.getChild("Extension").getValue());
		}
```
Es wird halt geguckt, wieviele Kinder root hat und die Schleife wird genauso oft durchlaufen.
Dann holst Du Dir immer das entsprechende Element und dann von diesem Element, die Daten die Du brauchst.

gruß klaus.


----------



## danielandross (25. Juni 2007)

ich danke euch. Es läuft jetzt.
Gruß


----------



## danielandross (2. Juli 2007)

Hallo, bin da nochmal auf ein xml problem gestoßen:
Meine XML Datei:

```
<?xml version="1.0"?>
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="file:///D:/autocreatedxmlFile1183364253441.xsd"
<root>
<Format>
<OID>1</OID>
<Extension>$ENC$</Extension>
<Mimetype></Mimetype>
<Description>#IBM Client Security(TCPA) Encrypted</Description>
<Category>Encrypted Data</Category>
<Segment>
<Value>368503F14AF9C9ACAE05B431AF53</Value>
<Offset>0</Offset>
<Action></Action>
</Segment>
<ExtractSize>300000</ExtractSize>
<Case>false</Case>
</Format>
</root>
```

Mein XML-Schema:

```
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xs:element name="root">
	<xs:complexType>
		<xs:sequence>
			<xs:element name="Format" minOccurs="1">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="OID" type="sx:ID" maxOccurs="1" minOccurs="1"/>
						<xs:element name="Extension" type="sx:string" minOccurs="1"/>
						<xs:element name="Mimetype" type="sx:string"  maxOccurs="1" minOccurs="1"/>
						<xs:element name="Category" type="sx:string" default="others" minOccurs="1"/>
						<xs:element name="ExtractSize" type="sx:integer" maxOccurs="1" minOccurs="0"/>
						<xs:element name="Case" type="sx:boolean" maxOccurs="1" minOccurs="1"/>
						<xs:element name="Description" type="sx:string"  minOccurs="0"/>
						<xs:element name="Segment" minOccurs="1">
							<xs:complexType>
								<xs:sequence>
									<xs:attribute name="Value" type="sx:string" maxOccurs="1" minOccurs="1"/>
									<xs:attribute name="Offset" type="sx:integer" maxOccurs="1" minOccurs="1"/>
									<xs:attribute name="Action" type="sx:string" maxOccurs="1" minOccurs="1"/>
								</xs:sequence>
							</xs:complexType>
						</xs:element>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
	</xs:complexType>

</xs:element>
</xs:schema>
```

Der Parser behauptet jetzt jedoch: Cannot find the declaration of element 'root'.

Aber ich meine dass das oben ganz klar definiert ist, verstehe daher das Problem nicht.

Weiß allerdings nicht ob mein root überhaupt ein complex typ sein muss, weil ich es ja so gestalten will dass sich in ihm meine Format entities befinden die ich ja durchparsen möchte und root bildet nur die Hülle für die Format Elemente


----------

