html wrapp methode funktioniert nicht überall - merkwürdig

Ntti

Mitglied
Hallo!

Folgendes: Ich habe für eine Application einen HTML Wrapper der HTML von eine HTML Seite extrahieren soll und in eine xml datei speichern, entwickelt. Hab es dann einem Kollegen zum testen geschickt und bei ihm läuft es nicht. Nach langem debuggen sind wir draufgekommen dass bei ihm die unten angeführte Methode einen leeren Array liefert, weil es nicht alle Tags einliest. Aber warum es das bei ihm nicht tut und bei mir schon kann ich mir nicht erklären. Es ist keine Frage von richtig aufrufen oder so ... muss was anderes sein. Bin sehr dankbar wenn jemand eine Idee hat!! Hier die Methode, die sollte eben teilstrings extrahieren und in ein array speichern:

Code:
function suche(string){
var seite = string;
var pos = 0;
var mode = 1;

var stack=new Array(); // für die speicherung von < tagsanfangszeichen
var posStack= new Array(); // für die speicherung von anfang und ende index von tags
var itempos= new Array(); // für die Speicherung von pos index von item infos
var voritems= new Array(); 


// die schleife durchläuft den html code der seite und filtert die position der teile die iteminfos beinhalten heraus und speichert sie in ein array
 
while(pos < seite.length){ 
    ch=seite.charAt(pos); 
   switch(mode){
   
   case 1:
            mode=1;
              if(ch=="<"){ // offenes tag gefunden
               stack.push("otag"); 
               posStack.push(pos); //postion des tags in posStrack speichern
               mode=2; } // mode wechseln ... nach > suchen
             pos++;
             break;
   case 2: 
             mode=2;
              if(ch=="<"){ // sollte wieder ein offenes tag gefunden werden statt geschlossenes
              stack.push("otag");
             posStack.push(pos);  // wird diese gespeichert
             mode=2; // mode beibehalten 
             pos++; // pos erhöhen und abbrechen
             break;
             }
             if(ch==">"){  // wenn ein geschlossenes > gefunden wird 
             stack.pop(); // der letzte eintrag von otag wird gelöscht
                   if(posStack.length==1){ // nur ein offenes tag gefunden 
                     posStack.push(pos); // position des geschlossenen wird gespeichert
                   var i0=posStack[0];  //lesen der pos von <
                   var i1=posStack[1];  //lesen der pos von > 
                var tag = seite.slice(i0,i1);   // tag estrahieren
                alert(tag);
               if(tag=="<div class=\"searchresultitem\""){  // nach dem tag soll gesucht werden
                      //der beginn der ergebnisse, pro item  /index wird im array gespeichert
                      itempos.push(i0);
                      }
                    posStack.pop(); // nach dem lesen von der inhalt von < > werden die postitonen gelöscht
                    posStack.pop();
                   pos++;
                   mode=1; 
                  break;                                        
                 }else{  // es wurden mehrere offene tags gefunden als geschlossene
                 posStack.push(pos);
                 var i2=posStack[posStack.length-2];  // siehe oben 
                 var i3=posStack[posStack.length-1]; 
                 var  tagi= seite.slice(i2,i3);
                 alert(tagi);
                 if(tagi=="<div class=\"searchresultitem\""){
                  itempos.push(i2);
                    }
                    posStack.pop();
                    posStack.pop();
                  pos++;
                  mode=1; 
                  break; 
                }
        }    
        pos++;
        break;
   default: alert("fehler bei der modeauswahl");
           pos++;
            break;
   
   }
 
}

  var anzahlitems= itempos.length;  
  var prim= anzahlitems % 2;
  if(prim!=0){ anzahlitems=anzahlitems-1}

  for(var i=0; i<anzahlitems; i++){    // text zwischen den searchresultitems  tags extrahieren und speichern
    var index1=itempos[i];
    var index2=itempos[i+1];
    var inhalt=seite.slice(index1,index2);
    voritems.push(inhalt);
  }

return voritems;   
            

 }

es ist vielleicht kein 100% sauberes javascript bin aber nur anfänger

Danke schon mal im Vorraus !

lg Ninette
 
....Es ist keine Frage von richtig aufrufen oder so ...

Habt ihr das beide mit der identischen Datei probiert?

Rein vom Prinzip her halte ich das Suchen nach Zeichen für unkomfortabel und sehr fehleranfällig... stattdessen würde ich eher, wenn ihr schon JS benutzt, sich dessen Möglichkeiten bedienen: Den String als DOM-Knoten nehmen und mittels DOM-Methoden verarbeiten.
 
ja ich denke schon das es die identische datei ist, sollte es zumindest so sein ich werd das nochmal überprüfen.

Zu deinem Vorschlag, erstmals danke. Wie mach ich aus einem String ein domknoten einfach so:
Code:
 document.createTextnode(string);
Das wäre dann ein textnode und kann ich mit dem dom auf die kinder eins textnodes zugreiffen? geht das nicht nur bei xml

lg Ninette
 
Ein Textknoten hilft dir da nicht weiter, da dieser ja nur lesbaren Text beinhaltet...wozu dann die Elemente aus dem String ebenfalls werden.

Eine Variante wäre z.B. dies:

Code:
<html>
<head>
<title>Test</title>
</head>
<body>
<iframe name="win" style="display:none"></iframe>
<script type="text/javascript">
<!--
function create_Document(html)
{
  with(window.win)
    {
      document.open();
      document.write(html);
      document.close();
      return(document)
    }
}
//-->
</script>
</body>
</html>

...ein Dokument kann man in bestehenden Fenstern(Frames) erzeugen.
Dort befindet sich nun ein iFrame, man öffnet dort ein Dokument, schreibt den HTML-Code hinein und fertig ist das Dokument.

create_Document() erwartet als Parameter den HTML-Code und liefert das Dokument zurück, welches du dann per DOM-Methoden verarbeiten kannst.
 
Hm ja eben Textknoten bringen nichts.

Ist eine gute Idee aber ich arbeite nicht mit html sondern mit xul, weiss nicht ob es da genauso geht. ich werds mal ausprobieren.

Das problem liegt doch nicht an der methode, sondern an dem http request der die html seite holt. Und zwar wird bei ihm nicht die ganze seite geladen wenn ich den request asynchron mach und ist der request synchron bleibt es natürlich hängen, weil die antwort nie ganz eintritt. der url für den http request ist zum teil festcodiert. Ich hab das programm einem anderen kollegen geschickt und bei dem gehts auch so wie bei mir. Warum es bei dem anderen nicht geht ... .. kann ich mir nicht vorstellen.

Aber wie du schon gesagt hast die suche im text ist sehr unzuverrlässig ich hab wochenlang nach eine lösung gesucht wie ich das blöde html im ein dom verarbeiten kann, hab aber nichts gefunden, blieb mir also nichts anderes übrig :(
 
ich habs probiert, theioretisch sollte es gehen es funkt aber nicht :(

folgendes hab ich gemacht:

1) iframe in xul erzeugt:
Code:
 	<iframe  id="win" name="win" style="display: none;"></iframe>
2) html seite zugewiesen das kann man nur mit der src attribute machenn
Code:
  var htmlsrc=speichereRequest(thaliadata); // ich mache das lokal weil es beim xul probleme gibt wenn man seiten von anderen domäne zur laufzeot loadet
             htmlsrc= "file:///" + htmlsrc;
  	    var win= document.getElementById('win');
		win.setAttribute("src",htmlsrc);
das funktioniert soweit so gut, ich hab das iframe visible gemacht und ds html war da

3) auf den document von iframe zugreifen laut xulplanet gibt es 2 methoden
Code:
 var domDoc = window.frames['win'].document;
oder
Code:
 var wind=document.getElementById('win'); 
   var domDoc=wind.contentDocument;
aber keiner funktioniert, mein programm stürzt immer ab wenn es zu eins der zeilen kommt :( ..
 
Mmmh...also ich hab das jetzt mal ausprobiert, und bei mir geht es..

per..
Code:
document.getElementById('win').setAttribute('src','.....');
...kann ich ein neues Dokument in das iframe laden.

Ich kann auch drauf zugreifen auf den Inhalt des Dokumentes...egal ob lokal oder(entfernter) Server.

Das Problem bei dem entfernten Server ist, dass das Laden halt dauert, und man warten muss, bis es fertig ist. Daher wäre die Variante mit dem XMLHttpRequest zzgl. schreiben ins iframe(-Dokument) doch besser, da man dort Kontrolle über den Ladestatus hat.

Warum das Dokument per XMLHttpRequest bei deinem Bekannten nicht fertiggeladen wird, kann ich mir nicht erklären :confused:
 

Neue Beiträge

Zurück