Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Existiert Knoten in XML Dokument (https://www.delphipraxis.net/90544-existiert-knoten-xml-dokument.html)

Luckie 19. Apr 2007 10:40


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:
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;
Und die passende XML-Datei dazu:
XML-Code:
  <?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>
Leider liefert mir mein Code immer False zurück.

Chewie 19. Apr 2007 11:22

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:

Luckie 19. Apr 2007 11:29

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;

Udontknow 19. Apr 2007 11:29

Re: Existiert Knoten in XML Dokument
 
Hallo!
Also, ich mach es so:

Delphi-Quellcode:
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;
Bei mir hat er den Knoten gefunden. Ist natürlich ein anderes Interface, aber vielleicht kannst du ja darauf umschwenken.

Edit: uses XMLIntf, XMLDoc...

Cu,
Udontknow

Luckie 19. Apr 2007 11:37

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.

Udontknow 19. Apr 2007 11:39

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

Luckie 19. Apr 2007 11:54

Re: Existiert Knoten in XML Dokument
 
Ich habe es jetzt so:
Delphi-Quellcode:
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;
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.

Udontknow 19. Apr 2007 11:56

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

Luckie 19. Apr 2007 12:07

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:

cruiser 19. Apr 2007 15:20

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 23:42 Uhr.
Seite 1 von 2  1 2      

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