求教,如何用delphi读取xml
求教,如何用delphi读取xml
[解决办法]
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, xmldom, XMLIntf, StdCtrls, msxmldom, XMLDoc, ExtCtrls, ComCtrls;
type
Tfrm_Main = class(TForm)
XMLDocument1: TXMLDocument;
Panel1: TPanel;
Splitter1: TSplitter;
Panel2: TPanel;
Memo1: TMemo;
Panel3: TPanel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Memo2: TMemo;
StatusBar1: TStatusBar;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function GetAppPath : string;
var
frm_Main: Tfrm_Main;
xmlClient :TXMLDocument;
implementation
{$R *.dfm}
function GetAppPath: string;
begin
Result := ExtractFilePath(ParamStr(0));
end;
procedure Tfrm_Main.Button1Click(Sender: TObject);
var
node :IXMLNode;
begin
if XMLDocument1.Active then
begin
{Read XML Node}
ShowMessage(XMLDocument1.ChildNodes[ 'gs '].ChildNodes[ 'art '].ChildNodes[ 'artNo '].Text);
node := XMLDocument1.ChildNodes[ 'gs '].ChildNodes[ 'art '].NextSibling;
ShowMessage(node.ChildNodes[ 'artNo '].Text);
{Write XML node}
{ShowMessage(XMLDocument1.ChildNodes[ 'art '].NextSibling.NodeName);
ShowMessage(XMLDocument1.ChildNodes[ 'gs '].ChildNodes[ 'art '].ChildNodes[ 'artNo '].Text);
XMLDocument1.ChildNodes[ 'note '].ChildNodes[ 'to '].Text := 'lxj ';
XMLDocument1.SaveToFile(XMLDocument1.FileName);
}
end else
begin
MessageBox(0, 'XML Document not Active ! ', 'Error ',MB_OK + MB_ICONERROR);
end;
end;
procedure Tfrm_Main.Button2Click(Sender: TObject);
var
filename : string;
code : string;
begin
if XMLDocument1.Active then
begin
code := DatetimeToStr(now());
code := StringReplace(code, ': ', ' ',[rfReplaceAll]);
code := StringReplace(code, '/ ', ' ',[rfReplaceAll]);
code := StringReplace(code, '\ ', ' ',[rfReplaceAll]);
{Save XML file}
filename := GetAppPath + 'Save ' + code + '.XML ';
XMLDocument1.SaveToFile(filename);
end else
begin
MessageBox(0, 'XML Document not Active ! ', 'Error ',MB_OK + MB_ICONERROR);
end;
end;
procedure Tfrm_Main.Button3Click(Sender: TObject);
begin
if RadioButton1.Checked then
XMLDocument1.XML := Memo1.Lines
else
XMLDocument1.XML := Memo2.Lines;
XMLDocument1.Active := True;
end;
//Create
procedure Tfrm_Main.Button4Click(Sender: TObject);
var
xmlDoc :TXMLDocument;
begin
//xmlClient := TXMLDocument.Create(nil);
//xmlClient.XML.Add( ' <gs> </gs> ');
//xmlCLient.Active := True;
XMLDoc := nil;
XMLDoc := TXMLDocument.Create(nil) ;
XMLDoc.FileName := 'interface.xml ';//WideString(edtExchgFile);
try
XMLDoc.Active := True;
//ÔÚÕâÀïʹÓà XMLDoc
Memo1.Lines.Add( '¸ù½ÚµãµÄÃû×ÖΪ: ' + XMLDoc.Node.NodeName );
Memo1.Lines.Add( '¸ù½ÚµãϵÄ×Ó½ÚµãÊýĿΪ: ' + IntToStr(XMLDoc.ChildNodes.Count ));
XMLDoc.Active := False;
except
on E:Exception do
begin
memo1.Lines.Add(E.message);
end;
end;
XMLDoc := nil;
end;
end.
[解决办法]
- Delphi(Pascal) code
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, XMLIntf, XMLDoc, StdCtrls; type TStudent = Class(TObject) public Name: string; Sex: string; Age: Integer; Phone: string; end; TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } FXMLDoc: IXMLDocument; // XML文档 FDocElement: IXMLNode; // 根节点 FList: TList; public { Public declarations } end; var Form1: TForm1; implementation uses Student; {$R *.dfm} const XMLString = '<?xml version="1.0" encoding="GB2312"?>' + '<Students>' + ' <Student Sex = "男">' + ' <Name>文文</Name>' + ' <Age>18</Age>' + ' <Phone>4745723</Phone>' + ' </Student>' + ' <Student Sex = "女">' + ' <Name>喃喃</Name>' + ' <Age>17</Age>' + ' <Phone>4644563</Phone>' + ' </Student>' + '</Students>'; procedure TForm1.FormCreate(Sender: TObject); begin FXMLDoc := TXMLDocument.Create(nil); FXMLDoc.XML.Text := XMLString; FXMLDoc.Active := True; FList := TList.Create; FDocElement := FXMLDoc.DocumentElement; end; procedure TForm1.FormDestroy(Sender: TObject); var i: Integer; begin FXMLDoc.Active := False; for i := 0 to Flist.Count - 1 do TStudent(FList.Items[i]).Free; FList.Free; end; procedure TForm1.Button1Click(Sender: TObject); var i: Integer; Stu: TStudent; StuNode: IXMLNode; begin for i := 0 to FDocElement.ChildNodes.Count - 1 do begin StuNode := FDocElement.ChildNodes[i]; Stu := TStudent.Create; Stu.Name := StuNode.ChildValues['Name']; Stu.Sex := StuNode.Attributes['Sex']; Stu.Age := StuNode.ChildValues['Age']; Stu.Phone := StuNode.ChildValues['Phone']; FList.Add(Stu); end; end; end.