![]() |
Existiert Knoten in XML Dokument
Ich will hier meine Frage noch mal explizit von dem ShellListview Problem losgelöst stellen: Wie finde ich heraus, ob ein bestimmter Knoten, in meinem Fall der Root-Knoten, in einem XML Dokument existiert? Hintergrund ist der, ich will mit meinem Programm nur XML Dateien öffnen, die auch von meinem Programm sind, weil mit anderen kann mein Programm nichts anfangen.
Bisher habe ich so was:
Delphi-Quellcode:
Und die passende XML-Datei dazu:
var
XMLDoc : DomDocument; Node : IXMLDOMNode; begin Result := False; CoInitialize(nil); XMLDoc := CoFreeThreadedDOMDocument.Create; if Assigned(XMLDoc) then begin XMLDoc.load(Filename); try Node := XMLDoc.selectSingleNode('/dwfbtemplate/'); except Result := Assigned(Node); end; end; CoUninitialize;
XML-Code:
Leider liefert mir mein Code immer False zurück.
<?xml version="1.0" encoding="ISO-8859-1" ?>
<dwfbtemplate> <info> <author>Michael Puff</author> <description>Nur zum Testen, sonst nichts.</description> </info> <layers> <layer x="105" y="80" w="532" h="400" /> <layer x="212" y="560" w="345" h="480" /> </layers> <textobjects> <textobject x="268" y="484" w="212" h="80" /> </textobjects> </dwfbtemplate> |
Re: Existiert Knoten in XML Dokument
Zum einen: Ich bin nicht sicher, ob das Probleme machen könnte, aber probiers besser mal mit '/dwfbtemplate' anstelle von '/dwfbtemplate/'.
Zum anderen: Bist du sicher, dass selectSingleNode eine Exception auslöst, wenn der Pfad nicht gefunden wird und nicht einfach nil zurückgibt? Du weißt ja außerdem Result nur im except-Block einen Wert zu, Result könnte also nur true werden, wenn eine Exception auftritt. Irgendwie passt da etwas nicht ganz zusammen, oder :zwinker: |
Re: Existiert Knoten in XML Dokument
Also es wird einfach nil zurückgegeben. Aber, ob ich den abschliessenden Schrägstrich schreibe oder nicht, macht keinen Unterschied:
Delphi-Quellcode:
class function TTemplateIO.IsFBITemplate(const Filename: WideString): Boolean;
var XMLDoc : DomDocument; Node : IXMLDOMNode; begin Result := False; CoInitialize(nil); XMLDoc := CoFreeThreadedDOMDocument.Create; if Assigned(XMLDoc) then begin XMLDoc.load(Filename); Node := XMLDoc.selectSingleNode('/dwfbtemplate'); Result := Assigned(Node); end; CoUninitialize; end; |
Re: Existiert Knoten in XML Dokument
Hallo!
Also, ich mach es so:
Delphi-Quellcode:
Bei mir hat er den Knoten gefunden. Ist natürlich ein anderes Interface, aber vielleicht kannst du ja darauf umschwenken.
procedure TForm65.Button1Click(Sender: TObject);
var XML:IXMLDocument; TemplateNode:IXMLNode; begin if not OpenDialog.Execute then exit; //Dokument erzeugen XML:=NewXMLDocument; try //Text übergeben XML.LoadFromFile(OpenDialog.Filename); //XML-Parser aktivieren XML.Active:=true; try if XML.Node.ChildNodes.FindNode('dwfbtemplate')<>NIL then ShowMessage('Jau, Knoten da!') else ShowMessage('Ja, wo ist er denn?') finally XML.Active:=False; end; finally XML:=NIL; end; end; Edit: uses XMLIntf, XMLDoc... Cu, Udontknow |
Re: Existiert Knoten in XML Dokument
Also ich benutze ja DomDocument. Und da kennt er die Eigenschaft Node nicht. Deklariere ich XMLDoc als IXMLDocumentIXMLDocument, kennt er NewXMLDocument nicht.
|
Re: Existiert Knoten in XML Dokument
Ja, ist eben die Frage, ob du nicht auf IXMLDocument umsatteln kannst/willst.
Edit: Hast du die Units XMLDoc und XMLIntf eingebunden? Da ist die Funktion NewXMLDocument implementiert. Cu, Udontknow |
Re: Existiert Knoten in XML Dokument
Ich habe es jetzt so:
Delphi-Quellcode:
Aber ich könnte irre werden, Result ist immer false, auch wenn ich die richtige Datei übergebe. Den try-except Block brauche ich, damit mir das nicht um die Ohren fliegt, wenn keine XML-Datei übergeben wird.
class function TTemplateIO.IsFBITemplate(const Filename: WideString): Boolean;
var XMLDoc : IXMLDocument; //DomDocument; Node : IXMLDOMNode; begin Result := False; XMLDoc := NewXMLDocument; if Assigned(XMLDoc) then begin try XMLDoc.LoadFromFile(Filename); Result := XMLDoc.Node.ChildNodes.FindNode('dwfbtemplate') <> nil; except // empty end; end; end; |
Re: Existiert Knoten in XML Dokument
Hmmm... Pack´mal ein ShowMessage(Filename) rein. Manchmal sind es ja so kleine Dinge.
Edit: Habe deinen Code auch nochmal ausgeschnitten und getestet, es funktioniert. Cu, Udontknow |
Re: Existiert Knoten in XML Dokument
Ja, ich glaube, es liegt am Pfad. Über gebe ich ihn hard gecodet funktioniert es. Jetzt hab eich aber wieder ein Problem mit dem ShellListview. :wall:
|
Re: Existiert Knoten in XML Dokument
Ist nochmal zum vorherigen Thread, Luckie... nicht AFolder.DisplayName sondern AFolder.PathName benutzen und das sollte eigentlich gehn... glaub ich... :drunken:
Sonst weisser ja nich, wo genau die Datei liegt |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:26 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 by Thomas Breitkreuz