Ok, sind keine 24h, aber das jetzt oben rein zu klemmen, wäre doch unübersichtlich:
Prüfen will ich, ob z.B.
XML\Section_1\SubSect_1\SubSubSect_1\Value_1 existiert. (Damit ich kein default-Wert lade, falls dort z.B. bereits ein Leerstring als gewünschter Wert gespeichert ist).
Zum Testen lege ich folgende
XML-Datei an:
XML-Code:
<?
xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<xml>
<Section_1 methode="with bloecke">
<Value_1>Section 1 Value 1</Value_1>
<Value_2>Section 1 Value 2</Value_2>
<SubSect_1>
<SubSubSect_1>
<Value_1>Section 1 SubSect 1 SubSubSect 1 Value 1</Value_1>
</SubSubSect_1>
</SubSect_1>
</Section_1>
</
xml>
Dazu folgende Funktion gebastelt, die auch korrekt die Pfad-Abschnitte ausschneidet und prüft (NodeName Zuweisung und ShowMessage() nur zu Prüfzwecken):
Delphi-Quellcode:
function himXML_NodeExists(
XML: TXMLFile; NodePath :
String): Boolean;
function GetNextFromPos(
var Offset : Integer) :
String;
var
EndOffset : Integer;
begin
EndOffset := PosEx('
\', NodePath, Offset);
Result := Copy(NodePath, Offset, EndOffset - Offset);
Offset := EndOffset +1;
end;
var
Node : TXMLNode;
i, Offset : Integer;
NodeName :
String;
begin
Offset := 1;
Node :=
XML.RootNode;
NodePath := IncludeTrailingPathDelimiter(NodePath);
while (Offset < Length(NodePath))
and (Node <>
NIL)
do
begin
NodeName := GetNextFromPos(Offset);
i := Node.Nodes.IndexOf(NodeName);
ShowMessage(NodeName+'
: '+IntToStr(i));
if i >= 0
then
Node := Node.Nodes[i]
else
Node :=
NIL;
end;
Result := Node <>
NIL;
end;
Nur wird immer ab dem 3. Node für IndexOf(Name) der Wert -1 zurückgegeben. Also alles was tiefer als 2 Ebenen ist, kann ich nicht mehr prüfen (bis Ebene 2 funktioniert es korrekt).
Der komplette "Button" Test-Code hier:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
XML : TXMLFile;
aNode : TXMLNode;
begin
XML := TXMLFile.Create(self);
with XML.RootNode.AddNode('
Section_1')
do
begin
Attributes.Add('
methode','
with bloecke');
AddNode('
Value_1').Text := '
Section 1 Value 1';
AddNode('
Value_2').Text := '
Section 1 Value 2';
with AddNode('
SubSect_1')
do
with AddNode('
SubSubSect_1')
do
AddNode('
Value_1').Text := '
Section 1 SubSect 1 SubSubSect 1 Value 1';
end;
if himXML_NodeExists(
XML, '
Section_1\SubSect_1\SubSubSect_1\Value_1')
then
ShowMessage('
Node gefunden')
else
ShowMessage('
Node nicht definiert');
xml.SaveToFile('
F:\WorkTemp\himXMLtest.xml');
end;
Ich frage mich, ob ich da falsch vorgehe. Im Quellcode von XMLNodeList hab' ich nachtürlich auch geschaut, mich aber in einer Hashliste verheddert und dachte dann, die gewünschte Antwort bekomme ich mit einem Post einfacher