Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   XE4: ADOM Core oder TXmlDocument, kann Datei nicht laden (https://www.delphipraxis.net/183921-xe4-adom-core-oder-txmldocument-kann-datei-nicht-laden.html)

hoika 13. Feb 2015 17:48

XE4: ADOM Core oder TXmlDocument, kann Datei nicht laden
 
Hallo,

ich versuche, entweder per ADOM CORE oder TXmlDocument die angehängte XML-Datei zu laden.
eigentlich ist das doch eine simple Datei?

Mit der alten 2009-er ADOM unter D2007 klappt das ohne Problem.

Weiss jemand, warum das nicht geht?

Ich habe folgende Links benutzt:
http://docwiki.embarcadero.com/CodeE...e_%28Delphi%29

Der Code aus dem folgenden Link funktioniert,
dann muss ich aber meinen Quellcode kompletten umbauen:
http://www.experts-exchange.com/Prog..._28366764.html


Hier der durch die Testerei etwas wirre Code ;)
Delphi-Quellcode:
unit XML_LesenTest;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm54 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form54: TForm54;

implementation

{$R *.dfm}

uses ComObj, XMLIntf, XMLDoc, MsXml;

(*
const
  CAttrName = 'attrName';
  HTAB = #9;
var
  LDocument: IXMLDocument;
  LNodeElement, LNode: IXMLNode;
  LAttrValue: string;
  I: Integer;
begin
  LDocument := TXMLDocument.Create(nil);
  LDocument.LoadFromFile(SrcPath); { File should exist. }

  { Find a specific node. }
  LNodeElement := LDocument.ChildNodes.FindNode('ThisIsTheDocumentElement');

  if (LNodeElement <> nil) then
  begin
    { Get a specific attribute. }
    Writeln('Getting attribute...');
    if (LNodeElement.HasAttribute(CAttrName)) then
    begin
      LAttrValue := LNodeElement.Attributes[CAttrName];
      Writeln('Attribute value: ' + LAttrValue);
    end;

    { Traverse child nodes. }
    Writeln(sLineBreak, 'Traversing child nodes...' + sLineBreak);
    for I := 0 to LNodeElement.ChildNodes.Count - 1 do
    begin
      LNode := LNodeElement.ChildNodes.Get(I);
      { Display node name. }
      Writeln(sLineBreak + 'Node name: ' + LNode.NodeName);
      { Check whether the node type is Text. }
      if LNode.NodeType = ntText then
      begin
        Writeln(HTAB + 'This is a node of type Text. The text is: ' + LNode.Text);
      end;
      { Check whether the node is text element. }
      if LNode.IsTextElement then
      begin
        Writeln(HTAB + 'This is a text element. The text is: ' + LNode.Text);
      end;
    end;
  end;
end;
*)

procedure CreateDocument;
var
  LDocument: IXMLDocument;
  LNodeElement, NodeCData, NodeText: IXMLNode;
begin
  LDocument := TXMLDocument.Create(nil);
  LDocument.Active := True;

  { Define document content. }
  LDocument.DocumentElement := LDocument.CreateNode('ThisIsTheDocumentElement', ntElement, '');
  LDocument.DocumentElement.Attributes['attrName'] := 'attrValue';
  LNodeElement := LDocument.DocumentElement.AddChild('ThisElementHasText', -1);
  LNodeElement.Text := 'Inner text.';
  NodeCData := LDocument.CreateNode('any characters here', ntCData, '');
  LDocument.DocumentElement.ChildNodes.Add(NodeCData);
  NodeText := LDocument.CreateNode('This is a text node.', ntText, '');
  LDocument.DocumentElement.ChildNodes.Add(NodeText);

  LDocument.SaveToFile('C:\ProjektA_TestDB\ICD10\1.xml');
end;


procedure TForm54.Button1Click(Sender: TObject);
begin
  CreateDocument;
end;
(*
const
  CAttrName = 'attrName';
  HTAB = #9;
var
  LDocument: IXMLDocument;
  LNodeElement, LNode: IXMLNode;
  LAttrValue: string;
  I: Integer;
  url: String;
begin
  // put url or file name
  url := 'C:\ProjektA_TestDB\ICD10\1.xml';
  //url := 'C:\ProjektA_TestDB\ICD10\2.xml';

  if not FileExists(url) then
  begin
    raise Exception.Create('XML file not found');
  end;

  LDocument := TXMLDocument.Create(nil);
  LDocument.LoadFromFile(url); { File should exist. }

  { Find a specific node. }
  LNodeElement := LDocument.ChildNodes.FindNode('kapitel_liste');

  if (LNodeElement <> nil) then
  begin
    { Get a specific attribute. }
    Writeln('Getting attribute...');
    if (LNodeElement.HasAttribute(CAttrName)) then
    begin
      LAttrValue := LNodeElement.Attributes[CAttrName];
      Writeln('Attribute value: ' + LAttrValue);
    end;

    { Traverse child nodes. }
    Writeln(sLineBreak, 'Traversing child nodes...' + sLineBreak);
    for I := 0 to LNodeElement.ChildNodes.Count - 1 do
    begin
      LNode := LNodeElement.ChildNodes.Get(I);
      { Display node name. }
      Writeln(sLineBreak + 'Node name: ' + LNode.NodeName);
      { Check whether the node type is Text. }
      if LNode.NodeType = ntText then
      begin
        Writeln(HTAB + 'This is a node of type Text. The text is: ' + LNode.Text);
      end;
      { Check whether the node is text element. }
      if LNode.IsTextElement then
      begin
        Writeln(HTAB + 'This is a text element. The text is: ' + LNode.Text);
      end;
    end;
  end;

end;
*)

procedure RetrieveDocument;
const
  CAttrName = 'attrName';
  HTAB = #9;
var
  LDocument: IXMLDocument;
  LNodeElement, LNode: IXMLNode;
  LAttrValue: string;
  I: Integer;
begin
  LDocument := TXMLDocument.Create(nil);
  LDocument.LoadFromFile('C:\ProjektA_TestDB\ICD10\1.xml'); { File should exist. }

  { Find a specific node. }
  LNodeElement := LDocument.ChildNodes.FindNode('BoolsAsChecks');

  if (LNodeElement <> nil) then
  begin
    { Get a specific attribute. }
    Writeln('Getting attribute...');
    if (LNodeElement.HasAttribute(CAttrName)) then
    begin
      LAttrValue := LNodeElement.Attributes[CAttrName];
      Writeln('Attribute value: ' + LAttrValue);
    end;

    { Traverse child nodes. }
    Writeln(sLineBreak, 'Traversing child nodes...' + sLineBreak);
    for I := 0 to LNodeElement.ChildNodes.Count - 1 do
    begin
      LNode := LNodeElement.ChildNodes.Get(I);
      { Display node name. }
      Writeln(sLineBreak + 'Node name: ' + LNode.NodeName);
      { Check whether the node type is Text. }
      if LNode.NodeType = ntText then
      begin
        Writeln(HTAB + 'This is a node of type Text. The text is: ' + LNode.Text);
      end;
      { Check whether the node is text element. }
      if LNode.IsTextElement then
      begin
        Writeln(HTAB + 'This is a text element. The text is: ' + LNode.Text);
      end;
    end;
  end;
end;

procedure TForm54.Button2Click(Sender: TObject);
begin
  RetrieveDocument;
end;

procedure TForm54.Button3Click(Sender: TObject);
var
  XMLDoc: IXMLDOMDocument;
begin
  XMLDoc := CoDOMDocument.Create;

  XMLDoc.load('C:\ProjektA_TestDB\ICD10\1.xml');
  Memo1.Lines.Add(XMLDoc.xml);
  Memo1.Lines.Add('');

  XMLDoc.load('C:\ProjektA_TestDB\ICD10\2.xml');
  Memo1.Lines.Add(XMLDoc.xml);
  Memo1.Lines.Add('');

  XMLDoc.load('C:\ProjektA_TestDB\ICD10\3.xml');
  Memo1.Lines.Add(XMLDoc.xml);
  Memo1.Lines.Add('');
end;

procedure TForm54.Button4Click(Sender: TObject);
var
  xml: IXMLDOMDocument;
  node: IXMLDomNode;
  nodes_row, nodes_se: IXMLDomNodeList;
  nodes_kapitel: IXMLDomNodeList;
  i, j: Integer;
  url: string;
begin
  // put url or file name
  url := 'C:\ProjektA_TestDB\ICD10\icd_2.1_74_tf+2015q1.xml';

  // klappt nicht
  //xml := CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument;

  xml := CoDOMDocument.Create;

  xml.async := False;
  //xml.loadXML(url);
  xml.load(url);

  if xml.parseError.errorCode <> 0 then
    raise Exception.Create('XML Load error:' + xml.parseError.reason);

  Memo1.Clear;
  nodes_row := xml.selectNodes('blabla');
  for i := 0 to nodes_row.length - 1 do
  begin
    node := nodes_row.item[i];

    //nodes_kapitel:= node.selectNodes('kapitel


    Memo1.Lines.Add('phrase=' + node.selectSingleNode('phrase').text);
    nodes_se := node.selectNodes('search_engines/search_engine/se_url');
    for j := 0 to nodes_se.length - 1 do
    begin
      node := nodes_se.item[j];
      Memo1.Lines.Add('url=' + node.text);
    end;
    Memo1.Lines.Add('--------------');
  end;end;

end.
Danke

Heiko

Der schöne Günther 13. Feb 2015 17:49

AW: XE4: ADOM Core oder TXmlDocument, kann Datei nicht laden
 
Bin ich blind oder hast du deine "C:\ProjektA_TestDB\ICD10\icd_2.1_74_tf+2015q1.xml " vergessen anzuhängen?

hoika 13. Feb 2015 18:12

AW: XE4: ADOM Core oder TXmlDocument, kann Datei nicht laden
 
Hallo,

das gibt es doch nicht!
Jetzt klappt das TXmlDocument (RetrieveDocument) doch !
Zumindestens lädt er das Dokument.

Nur das LNodeX.ChildNodes.FindNode scheint nicht rekursiv zu suchen,
sondern wirklich nur auf der aktuellen Child-Ebene.
Aber das ist egal.

Heiko

hoika 16. Feb 2015 08:41

AW: XE4: ADOM Core oder TXmlDocument, kann Datei nicht laden
 
Hallo Günther,

irgendwie hat das mit dem Anhängen nicht geklappt.
Aber das es jetzt geht, ist es eh egal.
(Das sind Daten der KBV/DIMDI, ich weiss gar nicht, ob ich die einfach so hochladen darf ...).

Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz