Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: MSXML-Parser, aber welcher?

  Alt 11. Aug 2010, 21:05
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 coDOMDocument60.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).
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (11. Aug 2010 um 23:02 Uhr)
  Mit Zitat antworten Zitat