Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Problem mit Funktion - Knoten suchen in XML (https://www.delphipraxis.net/119154-problem-mit-funktion-knoten-suchen-xml.html)

Grolle 21. Aug 2008 08:23


Problem mit Funktion - Knoten suchen in XML
 
Hallo,

ich habe eine Funktion, die nicht will, wie ich will:
Delphi-Quellcode:
  function searchNodes(node : IXMLNode; match : widestring) : IXMLNode;
  var
    x : integer;
  begin
    result := nil;
    if node.HasChildNodes then
    begin
      for x := 0 to node.ChildNodes.Count - 1 do
      begin
      if node.ChildNodes[x].Text = match then
        result := node.ChildNodes[x];
      end;
    end;
  end;
und wirft bei mir diese Exception:
Zitat:

Erste Gelegenheit für Exception bei $7C812AEB. Exception-Klasse EXMLDocError mit Meldung 'Element enthält keinen einzelnen Textknoten'. Prozess Project1.exe
Kann ich abfragen, ob ein Element einen Textknoten enthält?

Viele Grüße

omata 21. Aug 2008 08:56

Re: Problem mit Funktion - Knoten suchen in XML
 
Warum übergibst du den Node? Du benutzt ihn ja gar nicht!

Delphi-Quellcode:
function searchNodes(node : IXMLNode; match : widestring) : IXMLNode;
var
  x : integer;
begin
  result := nil;
  if assigned(node) then
  begin
    if node.HasChildNodes then
    begin
      for x := 0 to node.ChildNodes.Count - 1 do
      begin
      if node.ChildNodes[x].Text = match then
        result := node.ChildNodes[x];
      end;
    end;
  end;
end;

Grolle 21. Aug 2008 09:07

Re: Problem mit Funktion - Knoten suchen in XML
 
Hi,
Zitat:

Zitat von omata
Warum übergibst du den Node? Du benutzt ihn ja gar nicht!

Uuups, copy&paste error. Habs oben korregiert. Leider funktioniert es immer noch
nicht (mit assigned)#?!?

Viele Grüße ...

franksreich 21. Aug 2008 09:27

Re: Problem mit Funktion - Knoten suchen in XML
 
Hi,

ich habe mir damit geholfen den Typen auszulesen

Delphi-Quellcode:
   
  If xmlnode.HasChildNodes Then
  For n:=0 To xmlnode.ChildNodes.Count-1 Do
  Begin
    newxmlnode:=xmlnode.ChildNodes.Nodes[n];
     
    ...
   
    Case newxmlnode.NodeType Of
      ntText : Begin
                 // Funktion um ein Text-Element zu bearbeiten
               End;
      ntElement: Begin
                 End;
      ntProcessingInstr: Begin
                         End;
      ntDocType: Begin
                 End;
      ntReserved,
      ntAttribute,
      ntCData,
      ntEntityRef,
      ntEntity,
      ntComment,
      ntDocument,
      ntDocFragment,
      ntNotation : Begin
                   End;

Grolle 26. Aug 2008 08:05

Re: Problem mit Funktion - Knoten suchen in XML
 
Hallo,

leider bin ich noch nicht wirklich weitergekommen. Kann mir
jemand sagen, ob es einen einfachen Weg gibt von einem Knoten
einen Unterknoten mit dem Text "xyz" zu finden? Eigentlich
möchte ich nur wissen, ob ein solcher existiert.

Viele Grüße ...

bigg 26. Aug 2008 09:50

Re: Problem mit Funktion - Knoten suchen in XML
 
Hallo,

welche XML-Bibliothek verwendest du?

Grolle 26. Aug 2008 09:52

Re: Problem mit Funktion - Knoten suchen in XML
 
Hi,

XMLIntf, XMLDoc -> IXMLDocument

Viele Grüße ...

bigg 26. Aug 2008 09:56

Re: Problem mit Funktion - Knoten suchen in XML
 
MS XML, TXML, OmniXML, OpenXML, SimpleXML oder noch was ganz anderes?

Grolle 26. Aug 2008 10:01

Re: Problem mit Funktion - Knoten suchen in XML
 
Hi,

TXML

Viele Grüße ...

// Habe gerade was entdeckt: isTextElement ... mal schauen

bigg 26. Aug 2008 10:07

Re: Problem mit Funktion - Knoten suchen in XML
 
Hallo,

mit dieser Lib habe ich noch nicht gearbeitet, aber geh doch mal Schritt für Schritt durch alle Knoten, und lass dir den Textknoten mittels ShowMessage anzeigen. Eventuell ist das XML-Dokument nicht konform aufgebaut und wirft dadurch diesen Fehler?

Grolle 26. Aug 2008 10:13

Re: Problem mit Funktion - Knoten suchen in XML
 
Hallo,

im Moment lese ich es ja nicht nur aus, sondern baue es auf. Ich vermute,
dass da irgendwo der Fehler liegt. Im Prinzip soll es so funktionieren:
Knoten erstellen, falls Unterknoten mit Text "xyz" existiert weiter,
wenn nicht Unterknoten erzeugen.

Viele Grüße ...

marabu 26. Aug 2008 10:18

Re: Problem mit Funktion - Knoten suchen in XML
 
Hallo Stefan,

Textknoten mit einem bestimmten Inhalt kannst du so suchen:

Delphi-Quellcode:
var
  i: Integer;
  nl: IDOMNodeList;
begin
  with XMLDocument.DOMDocument as IDOMNodeSelect do
    nl := selectNodes('//*[text() = "SuchText"]');
  for i := 0 to Pred(nl.length) do
    with nl[i] as IDOMNodeEx do
      ShowMessage(XML);
end;
Freundliche Grüße

Grolle 26. Aug 2008 10:32

Re: Problem mit Funktion - Knoten suchen in XML
 
Hallo,

danke für eure Antworten. Habe jetzt die Lösung für mich gefunden:
Delphi-Quellcode:
  function searchNodes(nx : IXMLNode; match : widestring) : boolean;
  var
  x : integer;
  begin
    result := false;
    for x := 0 to nx.ChildNodes.Count - 1 do
    begin
      if (nx.ChildNodes[x].IsTextElement) and (nx.ChildNodes[x].NodeValue = match) then
        result := true;
    end;
  end;
@Marabu
ich nehme an deine Lösung verwendet xpath und ist somit noch schneller? Muss ich mir nochmal
genauer ansehen!

Viele Grüße ...

DeddyH 26. Aug 2008 10:41

Re: Problem mit Funktion - Knoten suchen in XML
 
Wenn Du nach der Result-Zuweisung noch mit break aus der Schleife springst, ist Deine Variante vermutlich auch schneller. Willst Du break vermeiden, musst Du eine andere Schleife verwenden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 Uhr.

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