XML-Knoten gezielt ansprechen

ahykes

Erfahrenes Mitglied
Hallo Leutz,

ich versuche gerade per Javascript meine XML-Datei auszulesen und in einer Tabelle anzeigen. Das funktioniert wie folgt auch ganz gut:

HTML:
function readXmlFileData(){

	if (window.XMLHttpRequest) xmlDataObject = new window.XMLHttpRequest();
	else xmlDataObject = new ActiveXObject("Microsoft.XMLHTTP");
	
	if(xmlDataObject){
		xmlDataObject.open("GET",'DATA/oisData.xml',false);
		xmlDataObject.send("");
		xmlDoc = xmlDataObject.responseXML;
	}else alert('Could not initialize XMLHTTP-Object.\nNo Dataoperation can be done.');
		
	if(!xmlDoc) {
		alert("No Data found!");
	}else{
		var elementCount = xmlDoc.getElementsByTagName("SYSTEM").length;
		
		for(i=0; i<elementCount; i++){
		
			var xmlObject 			= xmlDoc.getElementsByTagName("SYSTEM")[i];
						
			var basicTable			= document.getElementById('data');
			var newTableBody 		= document.createElement('tbody');
			var newTableRow	 		= document.createElement('tr');
			
			//Gerätname----------------------------------------------------------------------------------
			var newTableCell = document.createElement('td');
			var xmlNode = xmlObject.childNodes[0];
			if(xmlNode.hasChildNodes())	newTableCell.innerHTML	= xmlNode.firstChild.nodeValue;
			else newTableCell.innerHTML 	= '&nbsp;';
			newTableRow.appendChild(newTableCell);			
			
			//IP-Adresse---------------------------------------------------------------------------------		
			var newTableCell = document.createElement('td');
			var xmlNode = xmlObject.childNodes[1];
			if(xmlNode.hasChildNodes())	newTableCell.innerHTML	= xmlNode.firstChild.nodeValue;
			else newTableCell.innerHTML 	= '&nbsp;';
			newTableRow.appendChild(newTableCell);			
			
			//MAC-Adresse--------------------------------------------------------------------------------
			var newTableCell = document.createElement('td');
			var xmlNode = xmlObject.childNodes[2];
			if(xmlNode.hasChildNodes())	newTableCell.innerHTML	= xmlNode.firstChild.nodeValue;
			else newTableCell.innerHTML 	= '&nbsp;';
			newTableRow.appendChild(newTableCell);			
						
			newTableBody.appendChild(newTableRow);
			basicTable.appendChild(newTableBody);
						
		}
		window.defaultStatus = elementCount + ' Recordsets in XML-File  found';
	}
}

Meine XML-Datei sieht wie folgt aus (is natürlich nur ein Auszug) :) :
<?xml version="1.0" encoding="ISO-8859-1" ?>
<IPV>
<SYSTEM id="DE065-VIP-560">
<GERAET_NAME>DE065-VIP-560</GERAET_NAME>
<IP_ADRESSE>53.43.160.1</IP_ADRESSE>
<MAC_ADRESSE>003011021930<MAC_ADRESSE />
</SYSTEM>
</IPV>

Nun endlich zu meinem Problem / zu meiner Frage: Wie kann ich nun auf einen bestimmten Knoten mit der id XY zugreifen ohne vorher die ganze Datei durchorgeln zu müssen? Meiner Meinung nach muss das doch auch ohne den ganzen Overhead gehen, oder? :p
 
Zuletzt bearbeitet:
Moin,

rein von XML-Seite her betrachtet, müsstest du eine DTD für das XML haben, wo das IDAttribute als solches deklariert ist, und das Dokument eingangs validieren...dann könntest du mit getElementById() arbeiten.

Ob sich das in einem HTML-Dokument, wo du dies XML-Document lädts, anders verhält, hab ich noch nicht probiert... teste doch einfach mal, ob
Code:
xmlDoc.getElementById('XY')
etwas zuTage fördert.
 
Hey Guten Morgen,

ahh okay. Das bedeutet also, dass man in der DTD-Datei deklariert welche Element-Typen es gibt, gell?
Okay, dann muss ich mich da mal versuchen. Ehm...Könntest Du mir da Helfen? Wie die auszusehen hätte? Habe bei Wikipedia nachgeschlagen:

Kurzes XML-Dokument mit Verweis auf eine externe DTD

Code:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE hallo SYSTEM "hallo.dtd">
<hallo>Hallo Welt!</hallo>

Der Inhalt von "hallo.dtd"

<!ELEMENT hallo (#PCDATA)>

Kurzes XML-Dokument mit interner DTD

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE hallo [<!ELEMENT hallo (#PCDATA)>]>
<hallo>Hallo Welt!</hallo>
Was hat es zum Beispiel mit (#PCDATA) auf sich? Aber ist bestimmt das falsche Forum dafür gell?
 
Achja: getElementById('xy') geht leider nicht. Er sagt immer, dass getElementById('xy') in diesem Fall keine Funktion sei !(?)
 
Soweit bin ich schonmal

!DOCTYPE IPV[
<!ELEMENT SYSTEM (#PCDATA)>
<!ATTLIST SYSTEM id ID #REQUIRED>
<!ELEMENT GERAET_NAME (ANY)>
<!ELEMENT IP_ADRESSE (ANY)>
<!ELEMENT MAC_ADRESSE (ANY)>
]>

Habe auch eine gute Seite zum Nachlesen gefunden: http://www.w3schools.com/dtd/dtd_attributes.asp

Hat alles gut geklappt! Vielen Dank!
 
Zuletzt bearbeitet:
Leider ist das Thema wieder etwas aktueller ...

Im Firefox funktioniert das hier wunderbar:

Code:
		if (window.XMLHttpRequest) xmlDataObject = new window.XMLHttpRequest();
		else xmlDataObject = new ActiveXObject("Microsoft.XMLHTTP");
		
		if(xmlDataObject){
			xmlDataObject.open("GET",'data/stueckzahlen_xml.xml?'+new Date().getTime(),false);
			xmlDataObject.send("");
			xmlDoc = xmlDataObject.responseXML;
		}else alert('Could not initialize XMLHTTP-Object.\nNo Dataoperation can be done.');
		
			
		if(!xmlDoc) {
			alert("No Data found!");
		}else{
	
			
			try {
				
				var pdvProtokoll = xmlDoc.getElementById(protokollName);
				var stckz = pdvProtokoll.getElementsByTagName('G_STUECKZAEHLER');
				
				if(pdvProtokoll && stckz) throw "pdvData";
				else throw "noPdvData";
...

Beim Internexplorer funktioniert der Ausdruck "var pdvProtokoll = xmlDoc.getElementById(protokollName);" leider nicht. :eek:
 
Mmmh,

hab mal recherchiert, bei MS nennt sich die entsprechende Methode nodeFromID (warum auch immer).

Habs damit in nem Schnelltest zwar nicht zum Erfolg gebracht, aber wenigstens gibts keine Fehlermeldung wegen unbekannter Methode :)

Vielleicht hast du ja mehr Erfolg. :)
 
Jetzt kommts:

Vielen Dank erstmal für Deine Hilfe. Er wirft meine absolute Lieblingsfehlermeldung:

"NULL ist Null oder kein Objekt." :D

Irgendwie scheint diese Funktion nicht das zu tun was sie soll.:p
 
Es ist schon ein Kreuz :)

Folgendes klappt bei mir im IE...per XPath

Code:
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");
    xmlDoc.async = false;
    xmlDoc.setProperty("SelectionLanguage", "XPath"); 
    xmlDoc.load('pfad.xml?'+new Date().getTime());
    alert(xmlDoc.selectSingleNode("/IPV/SYSTEM[@id='DE065-VIP-560']").xml);

Allerdings nur ohne DTD :suspekt:
 
Zurück