Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [JS] XML-Parser-Klasse, wie realisieren? (https://www.delphipraxis.net/119281-%5Bjavascript%5D-xml-parser-klasse-wie-realisieren.html)

Matze 23. Aug 2008 15:59


[JS] XML-Parser-Klasse, wie realisieren?
 
Hallo,

da ich im Internet keine kleine XML-Parse-Klssse finden konnte (ich möchte wirklich nur parsen und keine Nodes verändern), dachte ich mir, ich schreibe selbst eine. Doch das ist absolutes Neuland für mich. Zum Parsen ist SAX deutlich schneller als DOM, habe ich herrausgefunden, aber für SAX muss man irgendwas importieren, daher denke ich, DOM wird auf jedenfall überall laufen.

Ich habe mir dann mal ein Tutorial angesehen, um die Grundlagen zu verstehen. Doch da hört's dann auch schon wieder auf. Dort gibt es das Beispiel:

Code:
try //Internet Explorer
  {
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async="false";
  xmlDoc.loadXML(text);
  }
catch(e)
  {
  try //Firefox, Mozilla, Opera, etc.
    {
    parser=new DOMParser();
    xmlDoc=parser.parseFromString(text,"text/xml");
    }
  catch(e) {alert(e.message)}
  }
document.write("xmlDoc is loaded, ready for use");
Das Problem ist, dass ich gerne eine Klasse hätte, die ich so verwenden kann:

Code:
xml = new xmlDoc();
xml.LoadXMLString(...);
xml.ParseString();

foreach (xml.nodes as node)
{
  document.write(node.get_value('key'));
}
Nur so als Pseudo-Code. Ich verlange keinesfalls, dass ihr mir das schreibt. Ich hätte gerne ein paar Ansätze.
Der Code oben aus dem Tutorial ist sowas von verzettelt. Dieser lässt sich eigentlich gar nicht aufteilen in die Methoden zum Erzeugen des Objekts und in eine zum Parsen. Gerade im Firefox-Abschnitt findet beides irgendwie gleichzeitig statt.

Kann mir da jemand ein paar Hilfestellungen geben, wie ich zu meiner Wunsch-Klasse komme?

Grüße

DGL-luke 23. Aug 2008 16:20

Re: [JS] XML-Parser-Klasse, wie realisieren?
 
:shock:
Das muss ich dir erklären?

1. Dokumentation für Microsoft.XMLDOM-ActiveX suchen
2. Dokumentation für JS-DOMParser() suchen
3. Wrapper-Klasse mit Browserweiche schreiben

Wo liegt jetzt das Problem?

Matze 23. Aug 2008 16:26

Re: [JS] XML-Parser-Klasse, wie realisieren?
 
Das Problem, das ich momentan habe, habe ich doch bereits geschrieben:
Diese Browserweiche ist in obigem Code enthalten, aber diese lässt sich nicht wirklich auseinander nehmen, da alles miteinander zusammenhängt. Ich möchte ja nicht gleich anfangen zu parsen.

Die ganzen Tutorials, die ich gesehen habe, machen es alle ähnlich wie oben und das finde ich recht schlampig.

DGL-luke 23. Aug 2008 16:37

Re: [JS] XML-Parser-Klasse, wie realisieren?
 
Ja, dann machs halt besser. Dass es natürlich hier und da ein wenig eng werden könnte, wenn die beiden Parserklassen zu unterschiedlich sind, ist klar...

Code:
class XmlParser {
  var useActiveX;
  var ParserObject;

  function XmlParser()
  {
    useActiveX = true;
 
    try //Internet Explorer
   {
     xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
     xmlDoc.async="false";
     ParserObject = xmlDoc;
   }
   catch(e)
   {
     useActiveX = false;
   
     try //Firefox, Mozilla, Opera, etc.
       {
       parser=new DOMParser();
       ParserObject = parser;
       }
     catch(e) {alert(e.message)}
   } 
  }
 
  function load(var contents)
  {
    if(useActiveX)
   {
     //selber coden...
   }
   else
   {
     //...macht schlau
   }
  }
}

Matze 23. Aug 2008 16:48

Re: [JS] XML-Parser-Klasse, wie realisieren?
 
Ach dann muss man tatsächlich ständig überprüfen, welcher Browser verwendet wird und jedesmal anders reagieren. :shock:
Dass es da keinen Standard gibt, bzw. wieder ein Browser, der dermaßen aus dem Rahmen fällt, wundert mich wirklich.

Dann muss ich das wohl oder übel so machen. Danke, dann baue ich da mal drauf auf.

DGL-luke 23. Aug 2008 17:09

Re: [JS] XML-Parser-Klasse, wie realisieren?
 
Ja das is leider so... die Browserweiche wirst du immer irgendwo brauchen wenn du so exotische Sachen machen willst.

Matze 23. Aug 2008 19:02

Re: [JS] XML-Parser-Klasse, wie realisieren?
 
Also JS ist nichts für mich. *g* Was mache ich denn hier falsch:

Der Versuch, das ganze halbwegs in eine Klasse zu packen:

Code:
function XMLParser()
{
   var _xmlDoc = null;

   this.loadXMLDoc = function (XMLFile)
   {
      try //Internet Explorer
      {
         _xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
      }
      catch(e)
      {
         try //Firefox, Mozilla, Opera, etc.
         {
            _xmlDoc = document.implementation.createDocument('','',null);
         }
         catch(e) { alert(e.message) }
      }
      
      try
      {
         _xmlDoc.async = false;
         _xmlDoc.load(XMLFile);
      }
      catch(e) { alert(e.message) }
   }
   
   this.getNodes = function (Node)
   {
      return _xmlDoc.getElementsByTagName(Node);
   }

   this.getChildValue = function (Node, Child)
   {
      return Node.getElementsByTagName(Child);
   }
}
Das Hintergrundwissen habe ich hierher: loadXMLDoc(), Node-Funktionen.

Mein Aufruf ist dieser:

Code:
var my_xml = new XMLParser();
my_xml.loadXMLDoc('http://localhost/books.xml');
   
xml_nodes = my_xml.getNodes('book');

for (i = 0; i < xml_nodes.length; i++)
{
   title = my_xml.getChildValue(xml_nodes[i], 'title');
   author = my_xml.getChildValue(xml_nodes[i], 'author');
   alert(title + ' ' + author);
}
Die XML-Datei.
xml_nodes.length ist jedoch immer 0. :(

DGL-luke 23. Aug 2008 19:49

Re: [JS] XML-Parser-Klasse, wie realisieren?
 
und du bist dir sicher, dass sowohl das ActiveX als auch das DOM-Objekt, das du da auf sehr obskure Weise heraufbeschwörst, die Methode getElementsByTagName implementieren?

Das ganze liegt übrigens nicht an JS selbst, aber das dürfte dir klar sein...

Matze 23. Aug 2008 19:54

Re: [JS] XML-Parser-Klasse, wie realisieren?
 
Zitat:

Zitat von DGL-luke
und du bist dir sicher, dass sowohl das ActiveX als auch das DOM-Objekt, das du da auf sehr obskure Weise heraufbeschwörst, die Methode getElementsByTagName implementieren?

Laut dieser und vieler anderen Seiten ja. Wobei ich auch die Möglichkeit aus dem 1. Beitrag versucht habe, die ebenfalls nicht ging. Nun versuche ich gerade das hier, was aber auch noch nicht klappt.

Matze 23. Aug 2008 20:28

Re: [JS] XML-Parser-Klasse, wie realisieren?
 
Das war nun was größeres, so geht's:

Code:
var parser = new DOMParser();
var doc = parser.parseFromString(xml_text, "text/xml");
var nodes = doc.getElementsByTagName("book");

for (i = 0; i < nodes.length; i++)
{
    title = nodes[i].getElementsByTagName("title")[0].firstChild.nodeValue;
}
Aber danke für deine Mühe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz