nicht-valides XML aus XMLHttpRequest in DOM schreiben

Gayson

Mitglied
Hallo!
Ich sende ein XMLHttpRequest, und zurück kommt "text/html", welches nicht valides XML enthält (z.B. sind teilweise ohne Werte). Ein http_request.responseXML ist wohl deshalb immer null, ein http_request.responseText funktioniert jedoch wunderbar. Die Fehlermeldung, nicht wohlgeformtes XML zu benutzen, kommt bei http_request.overrideMimeType('text/xml').
Ich würde gerne das XML mit den Javascript-DOM-Funktionen durchsuchen können, habe ich da irgendeine Chance?
Vielleicht sollte ich noch sagen, dass der Code in nem Greasemonkey-Skript läuft...
Vielen Dank!

Hier ein kleiner Codeausschnitt, stark gekürzt:
Code:
var http_request = false;
http_request = new XMLHttpRequest();
http_request.overrideMimeType('text/xml');
http_request.onreadystatechange = a_function;
http_request.open('GET', a_url, true);
http_request.send(null);
 
Du könntest per createElement() einen Dummy-Knoten erzeugen. Dessen innerHTML-Attribut weist du dann den responseText zu....fortan kannst du den Dummy-Knoten dann per DOM bearbeiten(ein Zugriff auf Elemente per getElementById() ist dabei aber nicht möglich).
 
Ich habe mal ein wenig rumprobiert:
Code:
var root = document.createElement("root");
root.innerHTML = http_request.responseText;
allDivs = root.getElementsByName("div");

Leider kommt da folgender Fehler:
Fehler: root.getElementsByName is not a function

Edited: Argh, falsche funktion benutzt: getElementsByTagName. So wie es aussieht, funktioniert das nun so
 
Zuletzt bearbeitet:
Du kannst dir mittels der funktionierenden Methoden die anderen Methoden für das "Dokument" selbst schreiben.
Hier mal ein Anfang:
Code:
<pre>
<script type="text/javascript">
<!--
dummyDoc=function(str)
{
  this.doc=document.createElement('root');
  this.doc.innerHTML=str;
  this.childNodes=this.doc.childNodes;
  
  this.getElementsByTagName=function(strTagName)
  {
    return this.doc.getElementsByTagName(strTagName);
  }
  
  this.getElementById=function(strId)
  {
    for(i=0;i<this.getElementsByTagName('*').length;++i)
      {
        if(this.getElementsByTagName('*')[i].id==strId)
          {
            return this.getElementsByTagName('*')[i];
          }
      }
    return false;
  }
  
  this.getElementsByName=function(strName)
  {
    arr=[];
    for(i=0;i<this.getElementsByTagName('*').length;++i)
      {
        if(this.getElementsByTagName('*')[i].name==strName)
          {
            arr.push(this.getElementsByTagName('*')[i]);
          }
      }
    return arr;

  }
  
}


root=new dummyDoc('<div id="blubb"><img name="bla"><img name="blubb"><input name="bla"></div>');


//DOM TESTEN
document.writeln('<h3>DOM-Test</h3>');
document.writeln('<xmp style="background:#f1f1f1">'+root.doc.innerHTML+'</xmp>');
document.writeln('Element mit ID <i>blubb</i> vorhanden:'+((root.getElementById('blubb'))?'ja':'nein'));
document.writeln('Anzahl Kindknoten:'+(root.childNodes.length));
document.writeln('Anzahl Elemente mit Namen <i>bla</i>:'+(root.getElementsByName('bla').length));
document.writeln('Anzahl <i>&lt;div&gt;</i>:'+(root.getElementsByTagName('div').length));
document.writeln('Anzahl <i>&lt;img&gt;</i>:'+(root.getElementsByTagName('img').length));
document.writeln('Anzahl <i>&lt;input&gt;</i>:'+(root.getElementsByTagName('input').length));
document.writeln('Anzahl Knoten gesamt:'+(root.getElementsByTagName('*').length));

//-->
</script>
</pre>
 

Neue Beiträge

Zurück