Einzelnen Beitrag anzeigen

aegidos

Registriert seit: 30. Okt 2007
40 Beiträge
 
Delphi 2007 Professional
 
#4

Re: XML Find Node with Attribute

  Alt 20. Mär 2010, 20:32
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
  Mit Zitat antworten Zitat