Ich werde wohl eine Kombination von IXMLNode und IDOMNode verwenden.
Über TXMLDocument kann man die komfortable Knotenverwaltung nutzen (allerdings ohne XPath).
Bestimmte Zugriffe auf existierende Knoten werde ich daher weiterhin über
(XML.DOMDocument as IDOMNodeSelect).selectNode(XPath)
lösen.
So kann ich beliebige Knoten im Dokument suchen oder über meine zwei Funktionen direkt auf bestimmte Knoten zugreifen.
Durch eine Überarbeitung können die Knoten nun auch "leer" sein, ohne dass es Probleme gibt:
Delphi-Quellcode:
function GetCompleteXPath(XPath, NodeName, IDName, IDValue, FieldName:
String):
String;
var
S:
String;
begin
S := '
';
if (NodeName <> '
')
and (FieldName <> '
')
then
begin
S := XPath + NodeName;
if (IDName <> '
')
and (IDValue <> '
')
then
S := S + '
[@' + IDName + '
="' + IDValue + '
"]';
S := S + '
/' + FieldName;
end;
Result := S;
end;
function xmlRead (XPath, NodeName, IDName, IDValue, FieldName:
String):
String;
var
N: IDOMNode;
begin
Result := '
';
XPath := GetCompleteXPath(XPath, NodeName, IDName, IDValue, FieldName);
try
N := (
XML.DOMDocument
as IDOMNodeSelect).selectNode(XPath);
if Assigned(N)
then
begin
if N.hasChildNodes
then
begin
N := N.childNodes[0];
if Assigned(N)
then
begin
Result := N.nodeValue;
end;
end;
end;
except
Beep;
end;
end;
procedure xmlWrite(XPath, NodeName, IDName, IDValue, FieldName, FieldValue:
String);
var
N, NN: IDOMNode;
begin
XPath := GetCompleteXPath(XPath, NodeName, IDName, IDValue, FieldName);
try
N := (
XML.DOMDocument
as IDOMNodeSelect).selectNode(XPath);
if Assigned(N)
then
begin
if N.hasChildNodes
then
begin
N := N.childNodes[0];
if Assigned(N)
then
begin
N.nodeValue := FieldValue;
end;
end
else
begin
NN :=
XML.DOMDocument.createTextNode(FieldName);
NN.nodeValue := FieldValue;
N.appendChild(NN);
end;
end;
except
Beep;
end;
end;
Um Knoten hinzuzufügen nutze ich dann die komfortablen Möglichkeiten wie z.B. AddChild und XMLNode.Text unter TXMLDocument.
Ich denke, das sollte die beste Lösung sein.