![]() |
Re: XML: Namespace - Zuweisung funktioniert nicht
Hallo marabu,
Zitat:
Das funktioniert aber leider auch nicht. Und 'Node := xmlDoc.selectSingleNode('/kml/Document/*');' ebenso wenig. Ziel ist es ja, alle Folder-Elemente - deren name-Eigenschaft ich ja nicht kenne - anzusprechen, ausgehend von einem bestimmten Punkt. Bisher - also ohne den Namespace in der XML-Datei - war dieser Ausgangspunkt ja 'xmlDoc.documentElement'. Diesen Übergebe ich ja an die Funktion 'ShowFolders' als IXMLDomElement. In dieser möchte ich ja dann mittels 'nlFolders := Node.selectNodes('Folder');' alle Folder-Elemente abgreifen, und in den TreeView schreiben. Das kann doch nicht sein, dass diese eine blöde Zeile da in der Datei all das kaputt macht, was vorher so schön funktioniert hat :( |
Re: XML: Namespace - Zuweisung funktioniert nicht
Zitat:
Ich kann nur aus Erfahrung sprechen. Und diese hat gezeigt, dass der Parser eben nicht mit Default Namespaces umgehen kann (ich habe eben gesucht, aber ich finde die Stelle im msdn nicht mehr, die ich meine...sry) Wie wäre es denn, wenn Sascha selbst mal schnell den Code umbauen würde? Er sieht ja dann gleich, ob es dann klappt oder nicht. Oder er nimmt alternativ die Deklaration des Default namespace heraus, dann müsste es eigentlich auch funktionieren. Auch wenn es arrogant klingt: aber ich schließe aus, dass ich mich (in diesem Fall) irre. Denn ich habe mit diesem "Fehler" auch schon genügend zu kämpfen gehabt. Sobald man dem Parser allerdings ein wenig "Nachhilfe" gibt, kommt er gut damit zurecht. Gruß |
Re: XML: Namespace - Zuweisung funktioniert nicht
Zitat:
Aber dadurch sehe ich ein klitzekleines Lichtlein am Ende des Tunnels und werde das gleich mal ausprobieren :thumb: |
Re: XML: Namespace - Zuweisung funktioniert nicht
Ich habe nochmal gesucht, und das hier gefunden:
Zitat:
Ich suche aber nochmal... Gruß |
Re: XML: Namespace - Zuweisung funktioniert nicht
Hallo Armin,
mag sein, dass der MSXML Parser das eine oder andere Problem hat - aber an der Stelle habe ich für diesen thread nie graben müssen, denn meine Demo-Anwendung verarbeitet die Daten von Sascha problemlos. Egal ob ich XPath verwende oder direkt über documentElement.firstChild() gehe.
Delphi-Quellcode:
Nachdenkliche Grüße vom marabu
procedure TDemoForm.FileOpenAccept(Sender: TObject);
var n: IXMLDOMNode; begin with Sender as TFileOpen do begin doc := CoDomDocument.Create; doc.async := false; if doc.Load(Dialog.FileName) then begin StatusBar.SimpleText := Dialog.FileName; TreeNodes.Clear; n := doc.selectSingleNode('/kml/Document'); // n := doc.documentElement.firstChild; ShowFolder(n as IXMLDOMElement, nil); end; end; end; |
Re: XML: Namespace - Zuweisung funktioniert nicht
Hallo Marabu,
ich sehe, unsere Definitionen der Variablen gehen auseinander... Ich erzeuge für gewöhnlich das IXMLDOMDocument mit CoDomDocument40.Create. Die Dokument-Variable ist dabei vom Typ "IXMLDOMDocument" oder "IXMLDOMDocument2". Könntest du das mal bitte umschreiben und dann mit XPath testen? Möglicherweise ist dieser Bug / dieses Feature neu. Danke und Gruß |
Re: XML: Namespace - Zuweisung funktioniert nicht
So, ich habe es endlich gefunden...
Zitat:
Ich habe Saschas xml-Datei mal so "validiert":
XML-Code:
Dann funktioniert folgender Code nicht:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0"> <Document> <Folder> <name>My Places</name> <open>1</open> <Folder> <name>Ordner1</name> <open>1</open> <Placemark> <name>Placemark1</name> <LookAt> <longitude>10.37993318693747</longitude> <latitude>19.35357660723419</latitude> <range>743945.2733547823</range> <tilt>-1.858292979523515e-013</tilt> <heading>1.206473994247129</heading> </LookAt> <styleUrl>root://styleMaps#default+nicon=0x307+h icon=0x317</styleUrl> <Point> <coordinates>10.37993318693747,19.35357660723419 ,0</coordinates> </Point> </Placemark> </Folder> </Folder> </Document> </kml>
Delphi-Quellcode:
...und die Exception wird geworfen.
procedure TForm1.btnGoClick(Sender: TObject);
var aXMLDoc: IXMLDOMDocument2; aXMLNode: IXMLDOMNode; begin aXMLDoc := CoDOMDocument40.Create; aXMLDoc.setProperty('NewParser', true); aXMLDoc.setProperty('SelectionLanguage', 'XPath'); if not aXMLDoc.loadXML(me1.Text) then raise Exception.Create('shyce war''s beim Laden des XML-Dokuments!'); aXMLDoc.save('test.xml'); aXMLNode := aXMLDoc.selectSingleNode('kml'); if aXMLNode = nil then raise Exception.Create('kein Knoten gefunden!'); ShowMessage(aXMLNode.xml); end; Bringe ich dem Parser aber bei, was M$ fordert, dann funktioniert der Code:
Delphi-Quellcode:
Ich hoffe, ich habe jetzt nicht noch mehr Verwirrung, sondern Aufklärung gestiftet...;)
procedure TForm1.btnGoClick(Sender: TObject);
var aXMLDoc: IXMLDOMDocument2; aXMLNode: IXMLDOMNode; begin aXMLDoc := CoDOMDocument40.Create; aXMLDoc.setProperty('NewParser', true); aXMLDoc.setProperty('SelectionLanguage', 'XPath'); // !!! aXMLDoc.setProperty('SelectionNamespaces', 'xmlns:DNS="http://earth.google.com/kml/2.0"'); if not aXMLDoc.loadXML(me1.Text) then raise Exception.Create('shyce war''s beim Laden des XML-Dokuments!'); aXMLDoc.save('test.xml'); aXMLNode := aXMLDoc.selectSingleNode('DNS:kml'); // !!! if aXMLNode = nil then raise Exception.Create('kein Knoten gefunden!'); ShowMessage(aXMLNode.xml); end; Gruß |
Re: XML: Namespace - Zuweisung funktioniert nicht
Also, eben nachgeprüft:
Matthias und Marabu, dass euer Code funktioniert, liegt daran, dass ihr das Objekt mit CoDOMDocument.Create erzeugt. Mit dem "alten" Parser funktioniert das und man kann - wie Matthias treffend formulierte - auf den ganzen SelectionNamespaces-Quatsch verzichten. Arbeitet man jedoch mit einer höheren Version (ich weiß jetzt nicht genau, ab welcher), dann funktioniert der Code nicht mehr. Sascha und ich haben mit CoDOMDocument40.Create erzeugt. Dann muss der Parser über die Default Namespaces in Kenntnis gesetzt und die XPath-Query entsprechend manipuliert werden. Ich hoffe, das Problem ist damit (endlich) aus der Welt...;) Gruß |
Re: XML: Namespace - Zuweisung funktioniert nicht
Hey, das funktioniert ja super :hello: :hello: :hello: :hello: *freu*
Oh menno, wie zwei so kleine Zahlen doch so viel verändern können :gruebel: Jetzt nur noch ein paar Kleinigkeiten *hoff* anpassen, und alles ist lecker - danke Euch :thumb: Ich denke, dass das Problem ggf. noch andere Leute treffen kann, die ebenfalls den aktuellen Parser benutzen - vielleicht sollte man das Ganze daher in die Code-Bibliothek aufnehmen. Wenn das Progrämmchen mal fertig ist, werdet Ihr unter den Credits erwähnt - ohne Euch hätte ich es nicht geschafft!!! |
Re: XML: Namespace - Zuweisung funktioniert nicht
Hallo Armin,
das hast du schön heraus gearbeitet - Danke dafür. Das Verhalten war von Microsoft bereits in den Help Files zu MSXML 3.0 dokumentiert und für eine spätere Version (4.0) angekündigt worden. Ich war bisher nur ein einziges mal drüber gestolpert - heute war das zweite und hoffentlich letzte Mal. Freundliche Grüße marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:16 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