![]() |
[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 ![]()
Code:
Das Problem ist, dass ich gerne eine Klasse hätte, die ich so verwenden kann:
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");
Code:
Nur so als Pseudo-Code. Ich verlange keinesfalls, dass ihr mir das schreibt. Ich hätte gerne ein paar Ansätze.
xml = new xmlDoc();
xml.LoadXMLString(...); xml.ParseString(); foreach (xml.nodes as node) { document.write(node.get_value('key')); } 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 |
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? |
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. |
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 } } } |
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. |
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.
|
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:
Das Hintergrundwissen habe ich hierher:
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); } } ![]() ![]() Mein Aufruf ist dieser:
Code:
Die
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); } ![]() xml_nodes.length ist jedoch immer 0. :( |
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... |
Re: [JS] XML-Parser-Klasse, wie realisieren?
Zitat:
![]() |
Re: [JS] XML-Parser-Klasse, wie realisieren?
Das war nun was größeres, so geht's:
Code:
Aber danke für deine Mühe.
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; } |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr. |
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