AJAX <-> PHP xmlRückgabe unsauber

NetBull

Erfahrenes Mitglied
Hi,

ich brauche für ein tool ein Ajax das für eine Auflistung jeden Datensatz einzeln abholt.

Der PHP Teil klappt auch und liefert sauber Datensatz für Datensatz in einer AJAX Schleife zurück:
Code:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE  WurzelElement SYSTEM 'index.dtd'>
<root>
	<treeViewNode>
		<requestid>0</requestid>
		<id>1</id>
		<parent>0</parent>
		<fullname>Test-Firma GmbH & CO KG</fullname>
		<typeid>1</typeid>
		<type>COMPANY</type>
	</treeViewNode>
</root>

Diese drei Methoden bauen das XML für die Ausgabe zusammen:
Code:
function parseXmlHeader()
		{
			$this->cXmlResponse = "<?xml version='1.0' encoding='UTF-8'?>\r";
			$this->cXmlResponse .= "<!DOCTYPE  WurzelElement SYSTEM 'index.dtd'>\r";			
			$this->cXmlResponse .= "<root>\r";
		}
		
		
		
		
		function parseXmlFoot()
		{
			$this->cXmlResponse .= "</root> \r";
		}
		
		
		
		
		function getNodes()
		{//*** holt die Nodes aus der Datenbank!
			
			$mDaBa = new clsDataBaseConnector();
			if($mDaBa->isConnected())
			{
				$mQuery = 
				"
					SELECT
						tvnodes.id, if(tvnodes.parent, tvnodes.parent, 0) as parent,
						CONCAT(tvnodes.name1, ' ', tvnodes.name2) as fullname,
						tvnodes.type as typeid, tvnodetypes.name as type
						
					FROM
						tvnodes, tvnodetypes
						
					WHERE
						tvnodetypes.id = tvnodes.type
						AND tvnodes.parent is NULL
	
					LIMIT ".$this->cResponseCounter.",1;				
				";
				
				$mMySqlResult = $mDaBa->Query($mQuery);
				
				if($mMySqlResult!=null)
					$this->parseArray($mMySqlResult);
				else 
					$this->parseError($mDaBa->Error());
			}
			else
				$this->parseError($mDaBa->Error());		
		}
hier noch die Methode die das Array in XML parsed...
Code:
function parseArray($aArray)
		{			
			foreach($aArray as $ds)
			{
				$this->cXmlResponse .= "\t<treeViewNode>\r";
				
				$keys = array_keys($ds);
				$this->cXmlResponse .= "\t\t<requestid>".$this->cResponseCounter."</requestid>\r";
				foreach($keys as $key)
					$this->cXmlResponse .= "\t\t<$key>".$ds[$key]."</$key>\r";
					
				$this->cXmlResponse .= "\t</treeViewNode>\r";
			}
			
		}

und am Ende wird das ganze noch ausgeben:
Code:
header("Content-type: text/xml");
 			header("Cache-Control: no-store, no-cache");
 			echo $this->cXmlResponse;

Soweit der PHP Teil, der funktioniert, falls ich nicht irgendwas übersehen habe, denn ich bekomme ein kaputtes XML Objekt... .
Code:
var xmlObj = XmlRequest.responseXML;
Das liefert mir zwar noch ein Oject, das scheint auch XML zu sein, aber folgender Fehler wird im im FireBug gezeigt:
xmlObject....
Fehler habe ich mal als Screenshot angehängt.

Wäre cool wenn jemand ne Lösung für mich hat, ich kämpf da schon den ganzen Tag mit und komm ned weiter.

cu s00n
deAndro
 
Anmerkung 1: Idie Sonderzeichen waren ein Problem, wie es scheint, wie kann man ü, & etc, die aus der Datenbank kommen, so ins XML schreiben das der das nicht als Fehler behandelt?
 
Anmerkung 2: Ist es ein Problem das ich im XML die Einrückung mit /t und die Zeilenumbrüche mit /n vorgenommen habe, weil die werden wiederrum als einzelne Nodes behandelt...
 
Anmerkung 1: Idie Sonderzeichen waren ein Problem, wie es scheint, wie kann man ü, & etc, die aus der Datenbank kommen, so ins XML schreiben das der das nicht als Fehler behandelt?

Du musst die Zeichen als Entities darstellen. Z.B. "&amp;" für "&". Ab PHP 5.4 geht das mit htmlentities (http://php.net/manual/en/function.htmlentities.php).

Anmerkung 2: Ist es ein Problem das ich im XML die Einrückung mit /t und die Zeilenumbrüche mit /n vorgenommen habe, weil die werden wiederrum als einzelne Nodes behandelt...

Jeder Text ist ein Knoten. Wenn du mehrzeiligen Text willst, musst du ihn in einen CDATA Block packen.

Code:
<![CDATA[
Mehrzeiliger
Text
Hier
mit >>>Sonderzeichen<<<
]]>
 
OK, das mit den Sonderzeichen leuchtet noch ein, weil es auch Steuerzeichen sind. Darf ich zwischen den Tags keine Formatierungen ausgeben? Ich habe die Zeilenumbrüche und Tabs ausgegeben, damit das auch sauber formatiert ist.
Code:
<tag></tag>\r
oder
Code:
\t\t<tag></tag>\r
 
autsch,... dann lass ich die weg. geht auch soweit. aber XML hat mir unter .NET schon nicht gefallen und nun unter JavaScript *schüttel*.. überhaupt so ohne compiler, richtiges intellisense.. *schaurig*
 
Also wenn du dich an diesen Textknoten störst, dann ist wohl eher dein Code zum Verarbeiten fehlerhaft. Ich habe damit bisher noch keine Probleme gehabt.


XML:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE  WurzelElement SYSTEM 'index.dtd'>
<root>
	<treeViewNode>
		<requestid>0</requestid>
		<id>1</id>
		<parent>0</parent>
		<fullname>Test-Firma GmbH &amp; CO KG</fullname>
		<typeid>1</typeid>
		<type>COMPANY</type>
	</treeViewNode>
	<treeViewNode>
		<requestid>0</requestid>
		<id>1</id>
		<parent>0</parent>
		<fullname>Foobar</fullname>
		<typeid>1</typeid>
		<type>COMPANY</type>
	</treeViewNode>
</root>

Javascript:
if(xhr.readyState === 4) {
	var xml = xhr.responseXML;

	var names = xml.documentElement.getElementsByTagName('fullname');

	for(var i = 0; i < names.length; i++) {
		alert(names[i].firstChild.nodeValue);
	}
}
 
Zuletzt bearbeitet von einem Moderator:
Du solltest nicht versuchen, XML per Zeichenkettenkonkatenation zusammenbasteln, dabei kommt selten XML heraus. Es gibt in PHP unter anderem http://www.php.net/manual/en/book.xmlwriter.php oder auch SimpleXML oder DOM, um XML programmatisch zu erstellen und damit dann auch ein den XML-Syntaxregeln entsprechendes Dokument zu bekommen.

Als Anmerkung noch: wenn du schon eine DTD verwendest, dann auch konsequent und richtig, so du DOCTYPE WurzelElement schreibst, dann sollte das Wurzelelement in deinem Dokument auch genau so (also "WurzelElement") lauten, du hast aber "root" genommen.
 

Neue Beiträge

Zurück