XML Tag-ID auslesen mit getElementById

Kenan89

Bekanntes Mitglied
Hallo,

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

Java:
<?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:

Java:
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?
 
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
Java:
<!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
Java:
<?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)".
 
Ich hab hier ein Beispiel vllt hilft das ja:
XML-File
Java:
<?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
Java:
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:
Java:
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.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben