Ich beschäftige mich jetzt schon ein paar Tage mit
XML-Parsern aber das ist schon etwas verwirrend ;-(
TXMLDocument ist recht einfach und komfortabel zu nutzen, bietet aber wohl auch einige Einschränkungen.
Daher habe ich es jetzt mit IXMLDOMDocument versucht.
Hier sind einmal die wesentlichen Punkte zu sehen:
Delphi-Quellcode:
uses
msxml;
...
var
xml: IXMLDOMDocument =
nil;
xmlNode, xmlRootNode: IXmlDomNode;
xmlNodeList: IXmlDomNodeList;
...
xml := coDOMDocument.Create;
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
...
procedure CreateNewDatabase;
var
xmlRoot: IXMLDomElement;
xmlPI: IXMLDomProcessingInstruction;
const
CodePage = '
UTF-8';
begin
xml := CoDOMDocument.Create;
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// xml.PreserveWhiteSpace := True; //??
xmlPI :=
xml.CreateProcessingInstruction('
xml', Format('
version="1.0" encoding="%s"', [codepage]));
xml.AppendChild(xmlPI);
xmlRoot :=
xml.CreateElement('
Wurzelknoten');
xml.AppendChild(xmlRoot);
xml.Save(DatabaseFileName);
end;
...
procedure OpenXml;
begin
xml.Load(DatabaseFileName);
xmlRootNode :=
xml.DocumentElement;
end;
...
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
Node: IXmlDomNode;
begin
XPath := GetCompleteXPath(XPath, NodeName, IDName, IDValue, FieldName);
try
Node := xmlRootNode.SelectSingleNode(XPath);
except
Node :=
nil;
end;
if Assigned(Node)
then
Result := Node.Text
else
Result := '
';
end;
...
procedure xmlWrite(XPath, NodeName, IDName, IDValue, FieldName, FieldValue:
String);
var
Node: IXmlDomNode;
begin
XPath := GetCompleteXPath(XPath, NodeName, IDName, IDValue, FieldName);
try
Node := xmlRootNode.SelectSingleNode(XPath);
except
Node :=
nil;
end;
if Assigned(Node)
then
Node.Text := FieldValue
else
AutomatischerNeuerKnotenAnDer-XPath-Position!?
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
RefreshXmlCtrlList;
end;
Meine Fragen:
1) Was ist an coDOMDocument
60.Create besser? Und wo finde ich das???
2) Kann ich es irgendwie bewerkstelligen, dass beim Schreiben eines Textes (der Knoten ist mit XPath angegeben) AUTOMATISCH der bzw. die fehlenden Knoten erzeugt werden?
3) Gibt es alternativ Funktionen, die fehlende Knoten anhand eines XPath nachträglich generieren?
Das Lesen eines nicht existierenden Knotens liefert mit meiner xmlRead einfach '' zurück.
Jetzt suche ich eine Möglichkeit immer unproblematisch neue Inhalte in die
XML zu schreiben (ähnlich wie bei einer Ini, da wird ja auch ggf. ein Eintrag neu erzeugt).