DOM Parser, kleine Frage

uppss

Aktives Mitglied
Liebe Forummietglieder,

eine Frage, warum kann ich auf die Daten vin, RELEASEID, PRODNO nicht zugreifen?

VIELEN DANK IM VORAUS!!!

xml:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<NAME xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="nisp73.xsd"><ETEST>
   <HEAD>
      <vin>WDD2130331A0000356</vin>
      <RELEASEID>R543653543 39</RELEASEID>
      <PRODNO>784tea361</PRODNO>
      <DATE>20140908</DATE>
   </HEAD>
</ETEST></NAME>



Java:
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		
		// Parse XML file
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder documentBuilder = factory.newDocumentBuilder();
		Document doc = documentBuilder.parse(new File("resultdata.xml"));
		
		String titleEl = doc.getDocumentElement().getNodeName();
		System.out.println("Title = " + titleEl);
		
		NodeList nodeList = doc.getElementsByTagName("head");
		
		String vin = "";
		String releaseId = "";
		int prodNo = 0;
		
		System.out.println("\tAlle Daten:");
		
		for(int i = 0; i < nodeList.getLength(); i++) {
			Element element = (Element)nodeList.item(i);
			vin = element.getElementsByTagName("vin").item(0).getChildNodes().item(0).getNodeValue();
			releaseId = element.getElementsByTagName("releaseid").item(0).getChildNodes().item(0).getNodeValue();
			prodNo = Integer.parseInt(element.getElementsByTagName("prodno").item(0).getChildNodes().item(0).getNodeValue());
			
			System.out.println(vin);
			System.out.println(releaseId);

		}
	}
}
 
Zuletzt bearbeitet:
[ot]Bitte für Java Code in Zukunft die Java-Tags verwenden, nicht die PHP-Tags 🙂 Danke![/ot]

Zu deinem Problem:
Java:
NodeList nodeList = doc.getElementsByTagName("head");
Wie groß ist denn diese Liste die du bekommst? Sicher das du "head" und nicht "HEAD" angeben musst?
 
Genau dasselbe Problem bei den anderen Tags.

Die Liste ist leer, hab das mal nachgetestet.

Ein Tipp für die Zukunft:
Stell bitte abgeschlossene Testdateien zur Verfügung. Also Tags schließen etc. Das erfreut die kleinen Helferlein hier, weil die dann nicht mehr selbst drin rum pfuschen müssen 😉
 
sorry, habe mich korrigiert, und werde zukünftig auch besser schreiben!

wenn ich aber HEAD schreibe, bekomme java.lang.NullPointerException

deswegen habe ich versucht, vin im xml-dok klein zu schreiben.
 
Hm, hier ist die Fehlermeldung, alles was mir eclipse ausspuckt!
hier ist die komplette quellcode:

Java:
import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class xmlReader {
	
	/**
	 * @param args
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 */
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		
		// Parse XML file
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder documentBuilder = factory.newDocumentBuilder();
		Document doc = documentBuilder.parse(new File("resultdata.xml"));
		
		String titleEl = doc.getDocumentElement().getNodeName();
		System.out.println("Title = " + titleEl);
		
		NodeList nodeList = doc.getElementsByTagName("HEAD");
		
		String vin = "";
		String releaseId = "";
		int prodNo = 0;
		int isid = 0;

		
		System.out.println("\tAlle Daten:");
		
		for(int i = 0; i < nodeList.getLength(); i++) {
			Element element = (Element)nodeList.item(i);
			vin = element.getElementsByTagName("vin").item(0).getChildNodes().item(0).getNodeValue();
			releaseId = element.getElementsByTagName("releaseid").item(0).getChildNodes().item(0).getNodeValue();
			prodNo = Integer.parseInt(element.getElementsByTagName("prodno").item(0).getChildNodes().item(0).getNodeValue());
			isid = Integer.parseInt(element.getElementsByTagName("isid").item(0).getChildNodes().item(0).getNodeValue());
			
			System.out.println(vin);
			System.out.println(releaseId);
			System.out.println(prodNo);
			System.out.println(isid);

		}
	}
}

xml:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<NISP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="nisp73.xsd"><ETEST>
   <HEAD>
      <vin>Wefefefefw0356</vin>
      <RELEASEID>RC2ewffscsd00 39</RELEASEID>
      <PRODNO>74535341</PRODNO>
      <RESULT>NOK</RESULT>
      <ISID>62226</ISID>
      <DATE>20140908</DATE>
	</HEAD>
</ETEST></NISP>

Title = NISP
Alle Daten:
Exception in thread "main" java.lang.NullPointerException
at xmlReader.main(xmlReader.java:44)
 
Zuletzt bearbeitet:
Java:
			vin = element.getElementsByTagName("vin").item(0).getChildNodes().item(0).getNodeValue();
			releaseId = element.getElementsByTagName("releaseid").item(0).getChildNodes().item(0).getNodeValue();
			prodNo = Integer.parseInt(element.getElementsByTagName("prodno").item(0).getChildNodes().item(0).getNodeValue());

Exception in thread "main" java.lang.NullPointerException
at xmlReader.main(xmlReader.java:44)

Solch einen Fehler kann man leicht per Debugging finden! Worin liegt das Problem?

Kontrolliere doch mal in der Zeile wo du "vin" auslesen willst, wieviele Element gefunden werden? (Auf diesen Fehler wurdest du vorhin schon hingewiesen)
 
Erstens bekomme ich Schüttelfrost wenn ich solche Zeilen wie die 44ff lese und zweitens: warum sollte "vin" denn Bitteschön eine Childnode haben?

Mach nur eine Anweisung pro Zeile und Werte erstmal die Rückgabe dieser aus. Dann klappt es auch ohne exceptions.

Claus
 
Jetzt geht's weiter, vielen, vielen DANK!!!!!
Bin absoluter Anfänger(mit ein wenig Erfahrung), deswegen habe ich nicht sofort reagiert, als mir geholfen wurde!!!
 
Hallo schon wieder!!!


xml von oben!, würde mich sehr-sehr freuen, wenn jemand mir ein paar tipps gibt, wo ich suchen soll oder wo ich selber nachschlagen kann!

wie kann ich weitere tags rausholen
ich brauche jetzt nur diese Zeile!
aus REVISION
<ITEM SOURCE="EXTERN" NAME="P456" REVISION="xx12345x"/>
bzw, was unter REVISION steht, hier: xx12345x


Code:
<?xml version="1.0" encoding="UTF-8"?>
<NAME xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="nisp73.xsd"><ETEST>
   <HEAD>
      <vin>WDD2130331A0000356</vin>
      <RELEASEID>R543653543 39</RELEASEID>
      <PRODNO>784tea361</PRODNO>
      <DATE>20140908</DATE>
      <REWORK>xx</REWORK>
      <REVISION>
         <ITEM SOURCE="EXTERN" NAME="P" REVISION="xxxxx"/>
         <ITEM SOURCE="EXTERN" NAME="P456" REVISION="xx12345x"/>
         <ITEM SOURCE="INTERN" NAME="N" REVISION="xxxxx"/>
         <ITEM SOURCE="INTERN" NAME="C" REVISION="xxxxx"/>
         <ITEM SOURCE="INTERN" NAME="MNEL" REVISION="xxxxxxxxxxxxx"/>
         <ITEM SOURCE="INTERN" NAME="CAN-PI" REVISION="xxxxxxxxxxx"/>
         <ITEM SOURCE="INTERN" NAME="CAN-VARE" REVISION="xxxxxxxxxx"/>
         <ITEM SOURCE="INTERN" NAME="CAN-VC" REVISION="xxxxxxx"/>
         <ITEM SOURCE="INTERN" NAME="WINDOWS" REVISION="xxxxxxxxxxxxxx"/>
      </REVISION>
   </HEAD>
</ETEST></NAME>

Vielen Dank im Voraus
Daniel
 
wie kann ich weitere tags rausholen
ich brauche jetzt nur diese Zeile!
aus REVISION
<ITEM SOURCE="EXTERN" NAME="P456" REVISION="xx12345x"/>
bzw, was unter REVISION steht, hier: xx12345x

Was hindert dich daran deinen eigenen Code vom 1.Post zu verwenden? (Habe die entsprechenden Stellen hier nochmals zitiert)

Java:
NodeList nodeList = doc.getElementsByTagName("head");
....
Element element = (Element)nodeList.item(i);
vin = element.getElementsByTagName("vin").item(0).getChildNodes().item(0).getNodeValue();
releaseId = element.getElementsByTagName("releaseid").item(0).getChildNodes().item(0).getNodeValue();
prodNo = Integer.parseInt(element.getElementsByTagName("prodno").item(0).getChildNodes().item(0).getNodeValue());
.....
 
Ich sehe da keinen Unterschied. Die Struktur des XML ist anders, die Art und Weise wie du Elemente auslesen kannst bleibt aber gleich.
Schau dir Dokumentation der entsprechende Library/Klasse an und überlege welche anderen Methoden du davon vielleicht verwenden kannst.
 
Wenn du Hilfe brauchst musst du eine konkrete Frage stellen, dazu gehört dein bisheriger Ansatz, eine Beschreibung was passiert und eine Beschreibung was eigentlichen passieren sollte.
Und eben auch dann eine bestimmte Frage
 
*.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
<NAME xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="nisp73.xsd"><ETEST>
   <HEAD>
      <vin>WDD2130331A0000356</vin>
      <RELEASEID>R543653543 39</RELEASEID>
      <PRODNO>784tea361</PRODNO>
      <DATE>20140908</DATE>
      <REWORK>xx</REWORK>
      <REVISION>
         <ITEM SOURCE="EXTERN" NAME="P" REVISION="xxxxx"/>
         <ITEM SOURCE="EXTERN" NAME="P456" REVISION="[B]xx12345x[/B]"/>
         <ITEM SOURCE="INTERN" NAME="N" REVISION="xxxxx"/>
         <ITEM SOURCE="INTERN" NAME="C" REVISION="xxxxx"/>
         <ITEM SOURCE="INTERN" NAME="MNEL" REVISION="xxxxxxxxxxxxx"/>
         <ITEM SOURCE="INTERN" NAME="CAN-PI" REVISION="xxxxxxxxxxx"/>
         <ITEM SOURCE="INTERN" NAME="CAN-VARE" REVISION="xxxxxxxxxx"/>
         <ITEM SOURCE="INTERN" NAME="CAN-VC" REVISION="xxxxxxx"/>
         <ITEM SOURCE="INTERN" NAME="WINDOWS" REVISION="xxxxxxxxxxxxxx"/>
      </REVISION>
   </HEAD>
</ETEST></NAME>

ich versuche eine bestimmte Zeile aus der xml-Datei rauszuholen, allerdings ohne Erfolg
ich habe so viel mit attributen ect probiert, komme trotzdem irgendwie nicht voran...

Java:
NodeList nodeListRevision = doc.getElementsByTagName("REVISION");
			
			for(int j = 0; j < nodeListRevision.getLength(); j++) {
				Element elementR = (Element) nodeListRevision.item(j);
				
				revisionPackage = element.getElementsByTagName("ITEM").item(0)
						.getChildNodes().item(0).getNodeValue();

ich brauche nur den Wert: xx12345x
 
ich versuche eine bestimmte Zeile aus der xml-Datei rauszuholen, allerdings ohne Erfolg

An die Liste der ITEM-Tags kommst du?
Wenn ja sehe ich das Problem nicht wirklich. Die richtige Liste der Element hast, dann musst du nur noch die Attribute überprüfen.

ich habe so viel mit attributen ect probiert, komme trotzdem irgendwie nicht voran...

Was hast du probiert? Bzw. wie hast du es probiert?
Ohne diesen Informationen kann es sonst passieren das dir 10 Leute antworten und jeder sagt dir eine Möglichkeit die du schon probiert hast 😉
 
ich komme an die Liste ITEM nicht:

Java:
revision = Integer.parseInt(element.getChildNodes().getAttributes().getNamedItem("SOURCE").getNodeValue());

Java:
revision = Integer.parseInt(element.getParentNodes().getAttributes().getNamedItem("SOURCE").getNodeValue());

* Int, weil ich selber xml Liste geändert habe

Code:
<DATE>20140908</DATE>
<TIME>103745</TIME>
<REVISION>
         <ITEM SOURCE="123" NAME="123" REVISION="123"/>
         <ITEM SOURCE="321" NAME="123" REVISION="123"/>
      </REVISION>
 
Zuletzt bearbeitet:
Du meinst wohl, der Code kompiliert nicht?
element.getChildNodes() liefert unter der Annahme, das element eine Instanz von org.w3c.dom.Element oder org.w3c.dom.Node ist, eine Instanz von org.w3c.dom.NodeList, und die hat keine Methode getChildNodes().
Lerne bitte mal, gescheite Fragen zu stellen.
Ausserdem hat weder Node noch Element eine Methode getParentNodes().
 
Zuletzt bearbeitet:
Es tut mir Leid, ich versuche zu konkretisieren...

xml:
<?xml version="1.0" encoding="UTF-8"?>
<NISP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="nisp73.xsd"><ETEST>
<HEAD>
<VIN>test</VIN>
<RELEASEID>test</RELEASEID>
<PRODNO>754546</PRODNO>
<REVISION>
<ITEM SOURCE="123" NAME="123" REVISION="12345678"/>
<ITEM SOURCE="321" NAME="123" REVISION="123"/>
</REVISION>
</HEAD></ETEST></NISP>

java code:
ich sitze schon seit Tagen und habe keine Lösung gefunden!!!
Ich muss auf <REVISION> kommen und dann auf ITEM und dann "12345678" ausgeben, was unter REVISION="12345678" steht...

Java:
package ru.domain.domparser;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class Main {

	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder documentBuilder = factory.newDocumentBuilder();
		Document doc = documentBuilder.parse(new File("myXmlConfig.xml"));
		
		String titleEl = doc.getDocumentElement().getNodeName();
		System.out.println("titleEl.: " + titleEl);
		
		NodeList nodeList = doc.getElementsByTagName("HEAD");
		
		String vin = "";
		String rel = "";
		String prod = "";
		int revision = 0;
		
		for(int i=0; i < nodeList.getLength(); i++){
			Element element = (Element)nodeList.item(i);
			
			vin = element.getElementsByTagName("VIN").item(0).getChildNodes().item(0).getNodeValue();
			rel = element.getElementsByTagName("RELEASEID").item(0).getChildNodes().item(0).getNodeValue();
			prod = element.getElementsByTagName("PRODNO").item(0).getChildNodes().item(0).getNodeValue();
			
			revision = Integer.parseInt(element.getChildNodes().getAttributes().getNamedItem("REVISION").getNodeValue());
			
			System.out.println("---------------");
			System.out.println("vin: " + vin);
			System.out.println("release: " + rel);
			System.out.println("prod: " + prod);
			System.out.println(revision);
		}	
	}	
}
 
Zuletzt bearbeitet:
Funktioniert das hier?
Java:
revision  = Integer.parseInt(element.getElementsByTagName("ITEM").item(0).getAttributes().getNamedItem("REVISION").getNodeValue())
Wenn nein, wie lautet die Fehlermeldung und der stack trace?
 
Nein, hier ist die Fehlermeldung aus eclipse

Code:
titleEl.: NISP
Exception in thread "main" java.lang.NullPointerException
	at org.domain.domparser.Main.main(Main.java:43)

:43 genau Deine Zeile
 
Zuletzt bearbeitet:
Und das hier?
Java:
NodeList items = element.getElementsByTagName("ITEM");
System.out.println("anzahl items " + items.getLength());
Node firstItem = items.item(0);
NamedNodeMap attributes = firstItem.getAttributes();
System.out.println("anzahl attribute " + attributes.getLength());
Node revisionNode = attributes.getNamedItem("REVISION");
revision  = Integer.parseInt(revisionNode.getNodeValue());
 
auch nicht, vielen Dank, für Deine Hilfe

Code:
titleEl.: NISP
anzahl items 0
Exception in thread "main" java.lang.NullPointerException
	at org.domain.domparser.Main.main(Main.java:47)

zeile 47: NamedNodeMap attributes = firstItem.getAttributes();

ich habe import org.w3c.dom.NamedNodeMap; importiert
 
Zuletzt bearbeitet:
Schlussfolgerung: die Anzahl der items ist 0, deshalb gibt items.item(0) null zurück, und beim Versuch, auf dem Nullpointer die Methode getAttributes() aufzurufen, fliegt eine NPE.
Ich hoffe, wir sind uns einig, daß meine nach deinem Stil programmierte Bandwurm-Zeile aus meinem 1. Post vollkommen ungeeignet ist, die Stelle der NPE rauszufinden. Deshalb Lektion 1: kein method chaining in Entwicklungscode, schon gar nicht, wenn es beim Aufruf zu einer Fehlermeldung kommt.

Stellt sich die Frage, warum keine ITEM Tags gefunden werden. Da dein Code mit der von dir geposteten XML Datei in meinem NetBeans läuft, schliesse ich daraus, dass die Datei die du verwendest, NICHT die Datei ist, die du gepostet hast.
Füge mal folgende Zeilen ein, bevor du die Datei parst:
Java:
String inhalt= new Scanner(new File("myXmlConfig.xml")).useDelimiter("\\Z").next();
System.out.println(inhalt);
und schaue die den Inhalt an.
Lektion 2: Wenn ein Input nicht wie gewünscht verarbeitet wird, sollte man in auf jeden Fall vor der Verarbeitung prüfen.
 
Zuletzt bearbeitet:
tatsächlich, Vielen Dank, ich habe beim testen meine xml Datei so verändert, dass da gar keine items vorhanden waren.
ich war so dumm, vielen Dank noch mal...
 

Zurück
Oben