Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Wenn ein Node kein NodeValue beinhaltet wie prüfen? (https://www.delphipraxis.net/194116-wenn-ein-node-kein-nodevalue-beinhaltet-wie-pruefen.html)

Kostas 18. Okt 2017 21:28

Wenn ein Node kein NodeValue beinhaltet wie prüfen?
 
Hallo Zusammen,

ich habe ein xml-Dokument welches ich nur auslesen muss.
Das Problem ist, es gibt Elemente die kein .NodeValue und auch kein .Text haben.
Versuche ich mit Assigned(aNode.NodeValue) zu prüfen ob das Element vorhanden ist, bekomme ich eine exception:
"Exception der Klasse EXMLDocError mit der Meldung 'Element "lr:ResultList" enthält keinen einzelnen Textknoten'


Delphi-Quellcode:
//if Assigned(aNode.NodeValue) <<< nicht kompatiblere Wert

                    if (aNode.NodeValue <> null)  <<<obere Exception.
                    then Memo1.Lines.Add(t + 'n: ' + aNode.NodeName + ' : ' +aNode.NodeValue)
                    else Memo1.Lines.Add(t + 'n: ' + aNode.NodeName);
Das Element "aNode" existiert weil seine Attribute auslesen kann.

Hat jemand eine Idee wie man prüfen kann ob ein NodeValue Element vorhanden ist?

Uwe Raabe 19. Okt 2017 00:50

AW: Wenn ein Node kein NodeValue beinhaltet wie prüfen?
 
Schau mal in
Delphi-Quellcode:
TXmlNode.CheckTextNode
. Dort wird die Bedingung getestet und bei Bedarf die Exception ausgelöst.

Also sowas in der Art (nicht getestet):
Delphi-Quellcode:
if not aNode.DOMNode.HasChildNodes or ((aNode.DOMNode.childNodes.length = 0) and (DOMNode.childNodes[0].nodeType in [TEXT_NODE, CDATA_SECTION_NODE])) then begin
  result := aNode.NodeValue;
end;

Jasocul 19. Okt 2017 06:37

AW: Wenn ein Node kein NodeValue beinhaltet wie prüfen?
 
Interessanterweise bin ich gestern über das gleiche Problem gestolpert.
Da ich das Auslesen der NodeValues schon vorher anders gelöst hatte, war es relativ einfach zu beheben. Ich nutze dafür eine Function:
Delphi-Quellcode:
function GetStringValue(aNode: IXMLNode; aDefault: String = ''): String;
begin
  if Assigned(aNode) then
  begin
    try
      if aNode.NodeValue <> Null then // Zur Behebung nachträglich eingebaut
      begin
        Result := aNode.NodeValue;
      end
      else
      begin
        Result := aDefault;
      end;
    except
      Result := aDefault;
    end;
  end
  else
  begin
    Result := aDefault;
  end;
end;
Die Prüfung auf Null hat das Problem bei mir behoben.
Achte darauf, dass die Null-Function aus System.Variants, verwendet wird, falls in deiner Delphi-Version noch andere Definitionen von Null hinterlegt sind.
Alternativ sollte auch die Function
Delphi-Quellcode:
VarIsNull
das Problem lösen können.

Falls das nicht hilft, schaue doch erstmal nach, ob der NodeName wirklich Null ist. Vielleicht liegt noch ein anderes Problem vor.

Kostas 19. Okt 2017 08:32

AW: Wenn ein Node kein NodeValue beinhaltet wie prüfen?
 
Hallo Zusammen,

wie immer hat der Uwe die passende Lösung. :-)

Peter, deine Varianten hatte ich alle schon ausprobiert. In meinem Fall funktioniert es nicht. Es funktioniert kein Assigned, VarIsNull, <> Null einfach nichts geht.

so hat es jetzt funktioniert:
Delphi-Quellcode:
if not aNode.DOMNode.HasChildNodes or ((aNode.DOMNode.childNodes.length = 0) and (aNode.DOMNode.childNodes[0].nodeType in [TEXT_NODE, CDATA_SECTION_NODE]))
                    then Memo1.Lines.Add(t + 'n: ' + aNode.NodeName + ' : ' +aNode.NodeValue)
                    else Memo1.Lines.Add(t + 'n: ' + aNode.NodeName);

Alles perfekt, herzlichen Dank für die Hilfe und einen schönen Tag.

Gruß Kostas


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 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