# XML Tag-ID auslesen mit getElementById



## Kenan89 (28. Jun 2012)

Hallo,

mein Java 2D Spiel geht weiter und ich bin dabei, die Spielkarten
mittels einer xml-Datei zu laden:


```
<?xml version="1.0" encoding="ISO-8859-1"?>

<level>
	
	<info id="info" sizeX="320" sizeY="320" lvlName="testlevel" tilesetName="tileset1.png" />

</level>
```

Das Problem ist, dass ich in Java nicht auf Elemente mit ID zugreifen kann:

JAVA-Code:


```
System.out.println(doc.getElementById("sizeX"));
```

Ich habe gelesen, dass man da irgendwie Java sagen muss, was jetzt
die wirkliche ID ist. Wie genau funktioniert das?


----------



## Kenan89 (29. Jun 2012)

Ich bin etwas weiter gekommen und habe gelernt, dass man eine dtd-Datei benötigt.
Diese habe ich erstellt, kann aber den Fehler nicht finden:

.dtd-Datei

```
<!ELEMENT level (info, tile*)>

<!ELEMENT info (EMPTY)>
	<!ATTLIST info id 			ID 			#REQUIRED>
	<!ATTLIST info sizeX 		CDATA 		#REQUIRED>
	<!ATTLIST info sizeY 		CDATA 		#REQUIRED>
	<!ATTLIST info lvlName 		CDATA 		#REQUIRED>
	<!ATTLIST info tilesetName 	CDATA 		#REQUIRED>
	
<!ELEMENT tile (EMPTY)>
	<!ATTLIST tile id			ID 			#REQUIRED>
	<!ATTLIST tile tileID		CDATA 		#REQUIRED>
	<!ATTLIST tile x 			CDATA 		#REQUIRED>
	<!ATTLIST tile y 			CDATA 		#REQUIRED>
	<!ATTLIST tile layer 		CDATA 		#REQUIRED>
	<!ATTLIST tile passable 	CDATA 		#REQUIRED>
```

XML-Datei

```
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE level SYSTEM "lvl.dtd">

<level>
	
	<info id="info" sizeX="320" sizeY="320" lvlName="testlevel" tilesetName="tileset1.png" />
	
	<tile id="0"	tileID="0" 		x="0" 		y="0"	 	layer="0" 	passable="0" />
	<tile id="1" 	tileID="2" 		x="32" 		y="0" 		layer="0" 	passable="0" />
	<tile id="2"	tileID="1"	 	x="64" 		y="0" 		layer="0" 	passable="0" />
	<tile id="3" 	tileID="1" 		x="96" 		y="0" 		layer="0" 	passable="0" />
	<tile id="4" 	tileID="2" 		x="128" 	y="0" 		layer="0" 	passable="0" />
	<tile id="5" 	tileID="1" 		x="160" 	y="0" 		layer="0" 	passable="0" />
	<tile id="6"	tileID="1" 		x="192" 	y="0" 		layer="0" 	passable="0" />
	<tile id="7" 	tileID="1" 		x="224" 	y="0" 		layer="0" 	passable="0" />
</level>
```

In Eclipse kriege ich die Fehlermeldung: Multiple annotations found at this line:
	- The content of element type "tile" is incomplete, it must 
	 match "(EMPTY)".
	- The content of element type "info" is incomplete, it 
	 must match "(EMPTY)".


----------



## jstei001 (29. Jun 2012)

Ich hab hier ein Beispiel vllt hilft das ja:
XML-File

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE map [ <!ELEMENT map (entry*) >
                <!ELEMENT entry EMPTY >
                <!ATTLIST entry key   ID    #REQUIRED
                                value CDATA "mydefault"> ]>
<map>
    <entry key="key1" value="value1"/>
    <entry key="key2" />
</map>
```

Methode zum XML auslesen

```
public static Document parseXmlFile(String filename, boolean validating) {
        try {
            // Create a builder factory
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setValidating(validating);

            // Create the builder and parse the file
            Document doc = factory.newDocumentBuilder().parse(new File(filename));
            return doc;
        } catch (SAXException e) {
            // A parsing error occurred; the xml input is not valid
        } catch (ParserConfigurationException e) {
        } catch (IOException e) {
        }
        return null;
    }
```


Main Methode:

```
public static void main(String[] args) throws Exception {
Document doc = parseXmlFile("externeFiles/test.xml", true);

		// Retrieve the element using id
		Element element = doc.getElementById("key1");

		System.out.println(element.getAttribute("value"));
}
```

EDIT: Als Alternative kannst du die Daten auch über ein .property File einlesen, da kommt es halt drauf an wie groß dein Spiel wird.


----------

