Hallo,
Also dass scheint doch mega advanced zu sein
zumindest für mich. Nachdem ich mir ein paar Tutorials reingezogen hab (Teilweise sind die recht alt von 2003) bin ich immer noch nicht weitergekommen.
Das SelectSingleNode kann ich nicht ausführen da ich mir kein
xmlDoc: IXMLDOMDocument2;
anlegen kann, was wiederum daran liegt, dass meine uses directive die UNITS msxml2 oder MSXML2_TLB nicht akzeptiert.
Von welchem Typ müsste denn rootelement sein?
Um einfach meine schon implementierten IXMLNode zu benutzen habe ich mir hier aus dem Forum eine
unit geholt:
ForumXML
von Midiar für OpenXML
adomxmldom.pas geschrieben.
Meine jetzt "verbesserte" Funktion stürtzt schon beim Laden des
XML Files ab. Das Hatte mit TXML noch ganz gut funktioniert, aber dafür gibt es ja kein SelectSingleNode.
VORHER
Delphi-Quellcode:
XMLDocumentDataGrid := TXMLDocument.Create(Application);
XMLDocumentDataGrid.FileName := FileName;
XMLDocumentDataGrid.Active := true;
NACHHER
Delphi-Quellcode:
procedure TForm1.SaveStringGrid( const FileName: TFileName);
var
f: TextFile;
i, k,l: Integer;
tagFound: Integer;
xmlTag,destFile : String;
XMLDocumentDataGrid: IXMLDOMDocument;
newNode,rootelement: IXMLNode;
eintraege: IXMLDOMNodeList;
subNode,node: IXMLDOMNode;
xmlDoc: IXMLDOMDocument;
nodelist: IXMLNodeList;
begin
l := 0;
tagFound := 0;
if FileExists(FileName)then
begin
//hier kommt schon der erste CRASH
XMLDocumentDataGrid.loadXML(FileName) ;
// loop through cells -- Hashtabelle mit korrespondierenden Wertepaaren
for i := 0 to LogDlg.dataGrid.RowCount - 1 do
for k := 0 to LogDlg.dataGrid.ColCount - 1 do
begin
if (LogDlg.dataGrid.Cells[k, i] <> '')and (LogDlg.dataGrid.Cells[k+1, i] <> '') then
begin
//in xmlTag steht der Wert den das Attribut cname dann bekommen soll
xmlTag := StringReplace(LogDlg.dataGrid.Cells[k, i], ' ', '', [rfReplaceAll, rfIgnoreCase]);
// Knoten mit XPath selektieren
eintraege := XMLDocumentDataGrid.selectNodes('werte/eintrag/grenzwert[@benutzt="ja"]');
node := XMLDocumentDataGrid.DocumentElement.selectSingleNode('//data[@cname=xmlTag]');
if(node<>nil)then begin
(node as IXMLNode).Text:=LogDlg.dataGrid.Cells[k+1, i];
end else begin
// XMLDocumentDataGrid.DocumentElement.appendChild(subNode).attributes['cname']:=xmlTag;
node := XMLDocumentDataGrid.DocumentElement.selectSingleNode('//data[@cname=xmlTag]');
node.Text:=LogDlg.dataGrid.Cells[k+1, i];
end;
end;
end;
XMLDocumentDataGrid.save(FileName);
// XMLDocumentDataGrid.Active := False;
end;
end;
Was mach ich denn nur falsch?
Danke und schöne Grüße
Andi