当前位置:文档之家› Delphi 中的 XMLDocument 类详解

Delphi 中的 XMLDocument 类详解

Delphi 中的 XMLDocument 类详解
Delphi 中的 XMLDocument 类详解

Delphi 中的XMLDocument 类详解

//函数

AddChild(const TagName: DOMString): IXMLNode; overload;

AddChild(const TagName, NamespaceURI: DOMString): IXMLNode; overload; CreateElement(const TagOrData, NamespaceURI: DOMString): IXMLNode;

CreateNode(const NameOrData: DOMString; NodeType: TNodeType = ntElement; const AddlData: DOMString = ''): IXMLNode;

GetDocBinding(const TagName: DOMString; DocNodeClass: TClass; NamespaceURI: DOMString = ''): IXMLNode;

GeneratePrefix(const Node: IXMLNode): DOMString;

IsEmptyDoc: Boolean;

//过程

LoadFromFile(const AFileName: DOMString = '');

LoadFromStream(const Stream: TStream; EncodingType: TXMLEncodingType = xetUnknown);

LoadFromXML(const XML: string); overload;

LoadFromXML(const XML: DOMString); overload;

Refresh;

RegisterDocBinding(const TagName: DOMString; DocNodeClass: TClass; NamespaceURI: DOMString = '');

Resync;

SaveToFile(const AFileName: DOMString = ''); dynamic;

SaveToStream(const Stream: TStream);

SaveToXML(var XML: DOMString); overload;

SaveToXML(var XML: string); overload;

//属性

Active

AsyncLoadState

ChildNodes

DocumentElement

DOMDocument

DOMImplementation

DOMVendor

Encoding

FileName

Modified

Node

NodeIndentStr

NSPrefixBase

Options

ParseOptions

SchemaRef

StandAlone

Version

XML

//事件

AfterOpen : 打开后

AfterClose : 关闭后

AfterNodeChange : 修改后

BeforeOpen : 打开前

BeforeClose : 关闭前

BeforeNodeChange : 修改前

OnAsyncLoad : 异步解析时的状态

//接口

IXMLDocumentAccess

IXMLDocument

IXMLNode

IXMLNodeList

IXMLNodeCollection

1、TXMLDocument 适用于内存中操作和建立新的 xml

2、一个 TXMLDocument 文档其实就是一个节点集合

3、每个节点包括名称、文本内容、属性集合、子节点集合

4、可以按位置或名称访问节点

5、每一个节点都是一个 IXMLNode 对象

6、每一个节点下包含的节点集合是一个 IXMLNodeList 对象, 用节点的 ChildNodes 属性获取

7、根节点 XMLDocument1.DocumentElement 也是一个 IXMLNode 对象

8、XMLDocument1.DocumentElement.ChildNodes 是一个 IXMLNodeList 对象, 访问一般从这里开始

9、可以把属性认为成横向的节点

读取xml 文件

先虚拟一个测试文件: test.xml; 放在 c:\temp\ 下备用.

<科室名单备注="测试">

<人员职务="科长" 备注="正局级">

<姓名>张三

<性别>男

<年龄>34

<人员职务="付科长">

<姓名>李四

<性别>女

<年龄>43

<人员>

<姓名>王五

<性别>女

<年龄>25

<人员>

<姓名>孙六

<性别>男

<年龄>52

<辅助人员>

unit Unit1;

interface

uses

Classes, Controls, Forms, StdCtrls, XMLDoc, xmldom, XMLIntf, msxmldom;

type

TForm1 = class(TForm)

Memo1: TMemo;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//载入方法1: LoadFromFile

procedure TForm1.Button1Click(Sender: TObject);

begin

XMLDocument1.LoadFromFile('c:\temp\test.xml');

Memo1.Lines := XMLDocument1.XML; {查看}

end;

//载入方法2: 指定 FileName, 然后激活

procedure TForm1.Button2Click(Sender: TObject);

begin

XMLDocument1.FileName := 'c:\temp\test.xml';

XMLDocument1.Active := True; {激活}

Memo1.Lines := XMLDocument1.XML; {查看}

end;

//载入方法3: 指定 LoadFromStream

procedure TForm1.Button3Click(Sender: TObject);

var

ms: TMemoryStream;

begin

ms := TMemoryStream.Create;

ms.LoadFromFile('c:\temp\test.xml');

XMLDocument1.LoadFromStream(ms);

ms.Free;

Memo1.Lines := XMLDocument1.XML; {查看}

end;

//可以用 LoadFromFile 或指定 FileName 的方法, 访问网上的 xml

procedure TForm1.Button4Click(Sender: TObject);

begin

XMLDocument1.LoadFromFile('https://www.doczj.com/doc/e25882736.html,/ig/skins/jr.xml');

Memo1.Lines := XMLDocument1.XML; {查看}

end;

end.

如果需要用浏览器查看 xml, 需要一个 api 函数: ShellAPI.ShellExecute, 所以先uses ShellAPI;

然后: ShellExecute(Handle, 'open', 'c:\temp\test.xml', nil, nil, SW_NORMAL);

获取根目录下的元素数

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;

type

TForm1 = class(TForm)

XMLDocument1: TXMLDocument;

Button1: TButton;

Button2: TButton;

Button3: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//打开

procedure TForm1.FormCreate(Sender: TObject);

begin

XMLDocument1.LoadFromFile('c:\temp\test.xml');

end;

//获取根目录下的元素数(1)

procedure TForm1.Button1Click(Sender: TObject);

begin

ShowMessage(IntToStr(XMLDocument1.DocumentElement.ChildNodes.Count)); {4} {DocumentElement 是根节点}

{ChildNodes 是节点包含的子节点的列表}

end;

//获取根目录下的元素数(2)

procedure TForm1.Button2Click(Sender: TObject);

var

nodeList: IXMLNodeList; {定义一个节点列表对象}

begin

nodeList := XMLDocument1.DocumentElement.ChildNodes;

{把根节点下的子节点列表赋给节点列表对象}

ShowMessage(IntToStr(nodeList.Count)); {4}

end;

var

node: IXMLNode; {定义一个节点对象}

nodeList: IXMLNodeList; {定义一个节点列表对象}

begin

node := XMLDocument1.DocumentElement;

{根节点也是一个节点, 把它赋给节点对象}

nodeList := node.ChildNodes;

ShowMessage(IntToStr(nodeList.Count)); {4}

end;

end.

获取元素内容

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;

type

TForm1 = class(TForm)

XMLDocument1: TXMLDocument;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//打开

procedure TForm1.FormCreate(Sender: TObject);

begin

XMLDocument1.LoadFromFile('c:\temp\test.xml');

{必须用万一提供的 xml 测试文件, 才能有相同的返回值}

end;

//访问第一个人的信息

procedure TForm1.Button1Click(Sender: TObject);

begin

ShowMessage(XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes['姓名'].Text);

ShowMessage(XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes['性别'].Text); {男}

ShowMessage(XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes['年龄'].Text); {34}

{可以通过位置访问子节点, 如: ChildNodes[0] 表示子节点列表中的第一个元素}

{可以通过子节点名访问子节点, 如: ChildNodes['姓名']}

{但在节点名一样的情况下, 只能通过位置访问}

{任何情况下都可以通过位置访问, 譬如:}

ShowMessage(XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes[0].Text);

{张三}

end;

//访问第二个人的信息

procedure TForm1.Button2Click(Sender: TObject);

var

nodeList: IXMLNodeList;

node: IXMLNode;

begin

nodeList := XMLDocument1.DocumentElement.ChildNodes;

node := nodeList[1];

ShowMessage(node.ChildNodes['姓名'].Text); {李四}

ShowMessage(node.ChildNodes['性别'].Text); {女}

ShowMessage(node.ChildNodes['年龄'].Text); {43}

end;

//获取所有成员姓名

procedure TForm1.Button3Click(Sender: TObject);

var

nodeList: IXMLNodeList;

node: IXMLNode;

num,i: Integer;

begin

nodeList := XMLDocument1.DocumentElement.ChildNodes;

num := nodeList.Count;

for i := 0to num - 1do

begin

node := nodeList[i];

ShowMessage(node.ChildNodes['姓名'].Text); {会分别显示: 张三李四王五孙六} end;

end;

//获取所有成员年龄

procedure TForm1.Button4Click(Sender: TObject);

var

nodeList: IXMLNodeList;

node: IXMLNode;

num,i: Integer;

begin

nodeList := XMLDocument1.DocumentElement.ChildNodes;

num := nodeList.Count;

for i := 0to num - 1do

begin

node := nodeList[i];

ShowMessage(node.ChildValues['年龄']); {会分别显示: 34 43 25 52}

end;

end.

访问节点属性

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;

type

TForm1 = class(TForm)

XMLDocument1: TXMLDocument;

Button1: TButton;

Button2: TButton;

Button3: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//打开

procedure TForm1.FormCreate(Sender: TObject);

begin

XMLDocument1.LoadFromFile('c:\temp\test.xml');

{必须用万一提供的 xml 测试文件, 才能有相同的返回值}

end;

//获取根元素属性

procedure TForm1.Button1Click(Sender: TObject);

var

nodeList: IXMLNodeList;

node: IXMLNode;

begin

ShowMessage(IntToStr(XMLDocument1.DocumentElement.AttributeNodes.Count)); {1}

ShowMessage(XMLDocument1.DocumentElement.Attributes['备注']); {测试} {通过属性名访问属性, 一般用 Attributes['属性名']}

ShowMessage(XMLDocument1.DocumentElement.AttributeNodes[0].Text); {测试} {通过属性位置访问属性, 必须用 AttributeNodes[位置ID]}

{但通过 AttributeNodes['属性名'] 也可以访问属性, 譬如:}

{AttributeNodes 是某个节点的属性列表, 它也是一个节点列表对象, 譬如:}

nodeList := XMLDocument1.DocumentElement.AttributeNodes;

node := nodeList[0];

ShowMessage(node.Text); {测试}

node := nodeList['备注'];

ShowMessage(node.Text); {测试}

end;

//访问第二个人的属性信息

procedure TForm1.Button2Click(Sender: TObject);

var

nodeList: IXMLNodeList;

node: IXMLNode;

begin

nodeList := XMLDocument1.DocumentElement.ChildNodes;

node := nodeList[1];

ShowMessage(IntToStr(node.AttributeNodes.Count)); {1}

ShowMessage(node.Attributes['职务']); {副科长}

ShowMessage(node.AttributeNodes[0].Text); {副科长}

end;

//访问某个节点的所有属性

procedure TForm1.Button3Click(Sender: TObject);

var

nodeList: IXMLNodeList;

node: IXMLNode;

num,i: Integer;

begin

nodeList := XMLDocument1.DocumentElement.ChildNodes;

node := nodeList[0];

num := node.AttributeNodes.Count;

for i := 0to num - 1do

begin

ShowMessage(node.AttributeNodes[i].Text); {会分别显示: 科长正局级} end;

end;

end.

获取节点名称与节点的属性名称

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;

type

TForm1 = class(TForm)

XMLDocument1: TXMLDocument;

Button1: TButton;

Button2: TButton;

procedure FormCreate(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//打开

procedure TForm1.FormCreate(Sender: TObject);

begin

XMLDocument1.LoadFromFile('c:\temp\test.xml');

{必须用万一提供的 xml 测试文件, 才能有相同的返回值}

end;

//获取节点名称

procedure TForm1.Button1Click(Sender: TObject);

var

node: IXMLNode;

begin

node := XMLDocument1.DocumentElement;

ShowMessage(node.NodeName); {科室名单}

node := node.ChildNodes[0]; {XMLDocument1.DocumentElement.ChildNodes[0]}

ShowMessage(node.NodeName); {人员}

node := node.ChildNodes[0];

{XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes[0]}

ShowMessage(node.NodeName); {姓名}

end;

//获取属性名称

procedure TForm1.Button2Click(Sender: TObject);

var

node: IXMLNode;

begin

node := XMLDocument1.DocumentElement;

ShowMessage(node.AttributeNodes[0].NodeName); {备注}

node := node.ChildNodes[0]; {XMLDocument1.DocumentElement.ChildNodes[0]}

ShowMessage(node.AttributeNodes[0].NodeName); {职务}

end;

end.

添加与删除节点

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

type

TForm1 = class(TForm)

XMLDocument1: TXMLDocument;

Memo1: TMemo;

Button1: TButton;

Button2: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//打开

procedure TForm1.FormCreate(Sender: TObject);

begin

XMLDocument1.LoadFromFile('c:\temp\test.xml');

{必须用万一提供的 xml 测试文件, 才能有相同的返回值}

end;

//添加

procedure TForm1.Button1Click(Sender: TObject);

var

newNode, newNodeAdd: IXMLNode;

begin

newNode := XMLDocument1.DocumentElement.AddChild('人员'); newNode.Attributes['职务'] := '秘书';

newNodeAdd := newNode.AddChild('姓名');

newNodeAdd.Text := '小翠';

newNodeAdd := newNode.AddChild('性别');

newNodeAdd.Text := '女';

Memo1.Lines := XMLDocument1.XML; {查看}

{会在尾部增加:

<人员职务="秘书"><姓名>小翠<性别>女 }

end;

//删除

procedure TForm1.Button2Click(Sender: TObject);

var

nodeList: IXMLNodeList;

begin

nodeList := XMLDocument1.DocumentElement.ChildNodes;

nodeList.Delete(nodeList.Count-1); {删除最后一条}

end;

end.

关于 HasChildNodes 与 IsTextElement

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;

type

TForm1 = class(TForm)

XMLDocument1: TXMLDocument;

Button1: TButton;

Button2: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//打开

procedure TForm1.FormCreate(Sender: TObject);

begin

XMLDocument1.LoadFromFile('c:\temp\test.xml');

{必须用万一提供的 xml 测试文件, 才能有相同的返回值}

end;

//HasChildNodes: 判断是否包含子节点

procedure TForm1.Button1Click(Sender: TObject);

var

node: IXMLNode;

b: Boolean;

begin

{我们从例子中拿出一个节点, 譬如根节点下的第一个节点:

<人员职务="科长" 备注="正局级">

<姓名>张三

<性别>男

<年龄>34

}

{先用节点对象获取这个节点}

{这个节点当然包含子节点, 并且是包含 3 个子节点}

b := node.HasChildNodes;

ShowMessage(BoolToStr(b)); {-1; 也就是 True}

ShowMessage(IntToStr(node.ChildNodes.Count)); {3}

ShowMessage(node.NodeName); {人员}

{再看其中的"姓名"节点:

<姓名>张三

}

{先用节点对象获取这个节点}

node := XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes[0];

b := node.HasChildNodes;

ShowMessage(BoolToStr(b)); {-1; 也就是 True}

ShowMessage(IntToStr(node.ChildNodes.Count)); {1}

ShowMessage(node.NodeName); {姓名}

{它里面只有文本"张三", 没有标签, 这时的节点才有 Text 属性}

ShowMessage(node.Text); {张三}

{获取"张三"这个文本节点}

node := XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes[0].ChildNodes[0];

b := node.HasChildNodes;

ShowMessage(BoolToStr(b)); {0; 也就是 False 没有子节点了}

ShowMessage(IntToStr(node.ChildNodes.Count)); {0; 子节点总数是 0}

ShowMessage(node.NodeName); {#text; 说明它是一个文本节点}

ShowMessage(node.NodeValue); {张三; 我们也可以取出它的值}

{文本节点的 NodeValue 属性等同于它上层节点的 Text 属性}

ShowMessage(node.ParentNode.Text); {张三}

end;

//IsTextElement: 判断是否是否具有 Text 属性

procedure TForm1.Button2Click(Sender: TObject);

var

node: IXMLNode;

b: Boolean;

begin

{我们从例子中拿出一个节点, 譬如根节点下的第一个节点:

<人员职务="科长" 备注="正局级">

<姓名>张三

<性别>男

<年龄>34

}

{先用节点对象获取这个节点}

node := XMLDocument1.DocumentElement.ChildNodes[0];

{这个节点肯定没有 Text 属性}

b := node.IsTextElement;

ShowMessage(BoolToStr(b)); {0; 也就是 False}

ShowMessage(node.NodeName); {人员}

{"姓名"节点}

node := XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes[0];

{"姓名"节点有 Text 属性}

b := node.IsTextElement;

ShowMessage(BoolToStr(b)); {-1; 也就是 True}

ShowMessage(node.NodeName); {姓名}

{"张三"这个文本节点}

node := XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes[0].ChildNodes[0];

{文本节点没有 Text 属性}

b := node.IsTextElement;

ShowMessage(BoolToStr(b)); {0; 也就是 False}

ShowMessage(node.NodeName); {#text}

end;

end.

判断节点类型: 支节点、叶节点、文本节点、空节点

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;

type

TForm1 = class(TForm)

XMLDocument1: TXMLDocument;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//打开

procedure TForm1.FormCreate(Sender: TObject);

begin

XMLDocument1.LoadFromFile('c:\temp\test.xml');

{必须用万一提供的 xml 测试文件, 才能有相同的返回值}

//什么是支节点与叶节点

{没有找到权威的参考, 我的理解是:

包含其他标签的节点是支节点; 不不包含其他标签的就是叶节点; 文本节点不算也节点.

}

{譬如根节点下的第一个节点:

<人员职务="科长" 备注="正局级">

<姓名>张三

<性别>男

<年龄>34

"人员" 节点是支节点;

"姓名"、"性别"、"年龄" 节点是叶节点;

叶节点中的部分是文本节点.

}

//判断是否是支节点

procedure TForm1.Button1Click(Sender: TObject);

var

node: IXMLNode;

begin

node := XMLDocument1.DocumentElement.ChildNodes[0]; {这是"人员"节点}

if node.HasChildNodes and not node.IsTextElement then

ShowMessage('是支节点'); {是支节点}

end;

//判断是否是叶节点

procedure TForm1.Button2Click(Sender: TObject);

var

node: IXMLNode;

begin

node := XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes[0]; {这是"姓名"节点}

if node.IsTextElement then

ShowMessage('是叶节点'); {是叶节点}

end;

//判断是否是文本节点

procedure TForm1.Button3Click(Sender: TObject);

var

node: IXMLNode;

begin

node := XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes[0].ChildNodes[0];

{这是"张三"那个文本节点}

if node.NodeName='#text'then

ShowMessage('是文本节点'); {是文本节点}

//判断是否是空节点

procedure TForm1.Button4Click(Sender: TObject);

var

node: IXMLNode;

begin

node := XMLDocument1.DocumentElement.ChildNodes[4];

{这是根节点下的第五个节点: "辅助人员", xml 中设为空}

if not node.HasChildNodes then

ShowMessage('是空节点'); {是空节点}

end;

end.

一个多余的属性: Nodes

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;

type

TForm1 = class(TForm)

XMLDocument1: TXMLDocument;

Button1: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//打开

procedure TForm1.FormCreate(Sender: TObject);

begin

XMLDocument1.LoadFromFile('c:\temp\test.xml');

{必须用万一提供的 xml 测试文件, 才能有相同的返回值}

end;

//一个多余的属性: Nodes

procedure TForm1.Button1Click(Sender: TObject);

var

node: IXMLNode;

begin

node := XMLDocument1.DocumentElement.ChildNodes[0];

ShowMessage(node.ChildNodes.Nodes[0].NodeValue); {张三}

ShowMessage(node.AttributeNodes[0].NodeValue); {科长}

ShowMessage(node.AttributeNodes.Nodes[0].NodeValue); {科长}

end;

end.

{

既然可以使用 ChildNodes[0].NodeValue 访问, 又何必存在 ChildNodes.Nodes[0].NodeValue 呢?

其实真正存在的是后者, 前者是后者的一种默认访问方式.

}

读取或设置xml 的编码与版本号

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;

type

TForm1 = class(TForm)

XMLDocument1: TXMLDocument;

Memo1: TMemo;

procedure FormCreate(Sender: TObject);

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//读取或设置 xml 的编码与版本号

procedure TForm1.FormCreate(Sender: TObject);

begin

XMLDocument1.LoadFromFile('c:\temp\test.xml');

ShowMessage(XMLDocument1.Version); {1.0}

ShowMessage(XMLDocument1.Encoding); {gb2312}

{另外, 这两个属性都是可写的, 譬如:}

XMLDocument1.Encoding := 'UTF-8';

Memo1.Lines := XMLDocument1.XML; {这时会显示乱码}

end;

end.

关于XML 属性

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;

type

TForm1 = class(TForm)

XMLDocument1: TXMLDocument;

Memo1: TMemo;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Button5: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//打开

procedure TForm1.FormCreate(Sender: TObject);

begin

XMLDocument1.LoadFromFile('c:\temp\test.xml');

{必须用万一提供的 xml 测试文件, 才能有相同的返回值}

end;

//XMLDocument1 对象的 XML 属性

procedure TForm1.Button1Click(Sender: TObject);

begin

{前面我们经常用这句话, 因为这里的 Lines 与 XML 同属于 TStrings}

Memo1.Lines := XMLDocument1.XML;

{如果不怕麻烦, 这样写也可以:}

Memo1.Lines.Text := XMLDocument1.XML.Text;

{如果知道了这一点, 那 XML 属性的功能可就多了, 并且这里的 XML 属性是可写的}

{不过这里要谈的是节点的 XML 属性}

end;

//根节点的 XML 属性

procedure TForm1.Button2Click(Sender: TObject);

var

node: IXMLNode;

begin

{先看根节点: XMLDocument1.DocumentElement}

node := XMLDocument1.DocumentElement;

//Memo1.Lines := node.XML; {这一句会出错}

Memo1.Lines.Text := node.XML; {将会读出根节点与根节点包含的所有内容} {还有一个更大的区别: 节点的 XML 是只读的!}

end;

//子节点的 XML 属性

procedure TForm1.Button3Click(Sender: TObject);

var

node: IXMLNode;

begin

node := XMLDocument1.DocumentElement;

node := node.ChildNodes[0];

Memo1.Lines.Text := node.XML; {会显示一个子节点的全部}

end;

//属性的 XML 属性

procedure TForm1.Button4Click(Sender: TObject);

var

node: IXMLNode;

begin

node := XMLDocument1.DocumentElement;

node := node.AttributeNodes[0]; {属性也是 IXMLNode 类型的}

ShowMessage(node.NodeName); {备注}

ShowMessage(node.NodeValue); {测试}

{用 XML 属性一次把他们都读出来:}

ShowMessage(node.XML); {备注="测试"}

end;

//叶节点的 XML 属性

procedure TForm1.Button5Click(Sender: TObject);

var

node: IXMLNode;

begin

node := XMLDocument1.DocumentElement;

node := node.ChildNodes[0];

node := node.ChildNodes[0];

node := node.ChildNodes[0]; {这就是叶节点了}

ShowMessage(node.XML); {张三}

{这时的 XML 属性和 Text 属性一样了}

ShowMessage(node.Text); {张三}

end;

end.

遍历XML 文件

unit Unit1;

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;

type

TForm1 = class(TForm)

XMLDocument1: TXMLDocument;

Button1: TButton;

Button2: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//读取 xml 的函数

{

功能1: 传入一个节点参数, 返回节点及其包含的所有内容;

功能2: 排除了空节点.

}

function ReadXml(node: IXMLNode): string;

var

nodeList,attrList: IXMLNodeList;

str,strName,strValue: string;

i: Integer;

begin

Result := '';

if not node.HasChildNodes then Exit;

attrList := node.AttributeNodes; {根节点的属性列表}

nodeList := node.ChildNodes; {根节点下的子节点列表}

str := '<' + node.NodeName;

{先读取属性}

for i := 0to attrList.Count - 1do

begin

strName := attrList[i].NodeName;

strValue := attrList[i].NodeValue;

str := str + ' ' + strName + '=' + AnsiQuotedStr(strValue, '"');

end;

str := str + '>' + sLineBreak; {sLineBreak 是常量, 相当于 #13#10} {读取子节点}

for i := 0to nodeList.Count - 1do

begin

strName := nodeList[i].NodeName;

if nodeList[i].IsTextElement then

begin

strValue := nodeList[i].NodeValue;

str := str + '<' + strName + '>' + strValue + '' + sLineBreak;

end else if nodeList[i].HasChildNodes then

begin

str := str + ReadXml(nodeList[i]); {这是最关键的递归调用}

end;

end;

str := str + ''; {封口}

Result := str;

end;

//调用测试(1):

procedure TForm1.Button1Click(Sender: TObject);

var

str,s1,s2: string;

begin

XMLDocument1.LoadFromFile('c:\temp\test.xml');

{必须用万一提供的 xml 测试文件, 才能有相同的返回值}

{读取文件头}

s1 := AnsiQuotedStr(XMLDocument1.Version, '"'); {读出版本, 并添加双引号}

s2 := AnsiQuotedStr(XMLDocument1.Encoding, '"'); {读出字符集, 并添加双引号}

str := Format('',[s1,s2]); {这就是文件头了}

str := str + sLineBreak + ReadXml(XMLDocument1.DocumentElement);

ShowMessage(str); {返回 xml 包含问头在内的所有内容}

end;

//调用测试(2)

procedure TForm1.Button2Click(Sender: TObject);

var

str: string;

node: IXMLNode;

begin

XMLDocument1.LoadFromFile('c:\temp\test.xml');

node := XMLDocument1.DocumentElement.ChildNodes[0];

str := ReadXml(node);

ShowMessage(str); {返回返回根节点下第一个子节点的所有内容}

end;

end.

创建与保存xml

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, xmldom, XMLIntf, StdCtrls, msxmldom, XMLDoc;

type

TForm1 = class(TForm)

XMLDocument1: TXMLDocument;

Delphi中错误信息对照表

Delphi中错误信息对照表 '''' not previously declared as a PROPERTY前面没有说明PROPERTY ''GOTO '' leads into or out of TRY statement GOTO 进入或超出TRY语句的范围 clause expected, but found要求子句,但出现 16-Bit fixup encountered in object file ''''在对象文件遇到16位修复486/487 instructions not enabled不能用486/487指令 Abstract methods must be virtual or dynamic抽象方法必须为虚拟的或动态的 Array type required需要数组类型Assignment to FOR-Loop variable ''''给FOR循环变量赋值Bad argument type in variable type array constructor在变量类型数组结构中不正确的参数类型 Bad file format ''''错误的文件格式 Bad file format: 错误的文件格式 Bad global symbol definition: '''' in object file ''''对象文件''''中错误的全局符号定义'''' Bad unit format: 错误的单元格式 BREAK or CONTINUE outside of loop BREAK或CONTINUE超出循环 Cannot add or subtract relocatable symbols不能增加或减少可重置的符号 Cannot assign to a read-only property不能指定只读属性Cannot BREAK, CONTINUE or EXIT out of a FINALLY clause超出FINALLY 子句的范围,不能使用BREAK,CONTINUE或EXIT语句 Cannot initialize local variables不能初始化局部变量Cannot initialize multiple variables不能初始化多个变量Cannot initialize thread local variables不能初始化线程局部变量 Cannot override a static method不能覆盖静态方法Cannot read a write-only property不能读取只写属性Case label outside of range of case expression CASE标号超出了CASE表达式的范围 Circular unit reference to 对单元循环引用 Class already has a default property类已具有默认的属性Class does not have a default property类没有默认的属性Class or object types only allowed in type section在类型区段只允许有类或对象类型 Class type required需要类类型 Close error on 文件关闭错误 Compile terminated by user用户中止编译Constant expected要求常量

实验3 类的定义、对象的建立与使用

实验报告_实验3 类的定义、对象的建立与使用(学 生学号_姓名) 实验目的: 1、理解C++中class与struct的区别; 2、掌握类的定义以及成员函数的定义方法; 3、掌握对象的定义和对象成员的访问方式; 4、熟悉this指针的基本用法。 实验内容 二、((基础题)请按照下列要求定义一个Clock时钟类,并创建对象,再调用相应方法: 程序代码: //日期类的应用 #include using namespace std; class Clock // 定义日期类 { public: // 定义公有成员函数 void setTime(int h, int m, int s); void showTime(); private: // 定义私有数据成员 int hour; int minute;

int second; }; // 类定义体的结束 //类实现部分 void Clock::setTime(int h, int m, int s) { hour = h; minute = m; second = s; } void Clock::showTime() { cout << "设置时间为" << hour <<":"<< minute <<":"<< second << endl; } int main() { Clock now; now.setTime(8,30, 0); now.showTime(); return 0; } 三、(基础题)请按要求,编写程序(请将类的定义、成员函数的实现、类的使用分开): rect.h代码: #include

java_Dom4j解析XML详解

学习:Dom4j 1、DOM4J简介 DOM4J是https://www.doczj.com/doc/e25882736.html, 出品的一个开源XML 解析包。DOM4J应用于Java 平台,采用了Java 集合框架并完全支持DOM,SAX 和JAXP。 DOM4J 使用起来非常简单。只要你了解基本的XML-DOM 模型,就能使用。 Dom:把整个文档作为一个对象。 DOM4J 最大的特色是使用大量的接口。它的主要接口都在org.dom4j里面定义:

接口之间的继承关系如下: interface https://www.doczj.com/doc/e25882736.html,ng.Cloneable interface org.dom4j.Node interface org.dom4j.Attribute interface org.dom4j.Branch interface org.dom4j.Document interface org.dom4j.Element interface org.dom4j.CharacterData interface org.dom4j.CDATA interface https://www.doczj.com/doc/e25882736.html,ment interface org.dom4j.Text interface org.dom4j.DocumentType interface org.dom4j.Entity interface org.dom4j.ProcessingInstruction 2、XML文档操作1 2.1、读取XML文档: 读写XML文档主要依赖于org.dom4j.io包,有DOMReader和SAXReader两种方式。因为利用了相同的接口,它们的调用方式是一样的。 public static Docum ent load(String filenam e) { Document docum ent =null; try { SAXReader saxReader = new SAXReader(); docum ent =saxReader.read(new File(filename)); //读取XML文件,获得docum ent 对象 } catch (Exception ex) { ex.printStackTrace();

XML报文解析测试

XML报文解析测试 在平时工作中,难免会遇到把 XML 作为数据存储格式。面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历 XML 这块来测试,因为遍历 XML 是工作中使用最多的(至少我认为)。 预备 测试环境: AMD 毒龙1.4G OC 1.5G、256M DDR333、Windows2000 Server SP4、Sun JDK 1.4.1+Eclipse 2.1+Resin 2.1.8,在 Debug 模式下测试。 XML 文件格式如下: <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> <NO>A1234</NO> <ADDR>四川省XX县XX镇XX路X段XX号</ADDR> </VALUE> <VALUE> <NO>B1234</NO> <ADDR>四川省XX市XX乡XX村XX组</ADDR> </VALUE> </RESULT> 测试方法: 采用 JSP 端调用Bean(至于为什么采用JSP来调用,请参考: https://www.doczj.com/doc/e25882736.html,/rosen/archive/2004/10/15/138324.aspx),让每一种方案分别解析10K、100K、1000K、10000K的 XML 文件,计算其消耗时间(单位:毫秒)。 JSP 文件: <%@ page contentType="text/html; charset=gb2312" %> <%@ page import="com.test.*"%> <html> <body> <% String args[]={""}; MyXMLReader.main(args); %>

类的定义和对象的创建

实验二类的定义和对象的创建 实验目的 1、学习定义类和使用类 2、学习创建的对象和使用对象 实验内容 1、定义一个Student类。其中定义有“学号”“姓名”“班级”“性别”“年龄”等属性,定 义一个无参数的构造器和至少一个有参数的构造器,定义“获得学号”“获得姓名”“获得班级”“获得性别”“获得年龄”“修改年龄”等方法。另外定义一个方法: public String toString( ) 把Student类的对象的所有属性信息组合成一个字符串,并检验这个功能的程序体现。 public class Student { private int 学号; private String 姓名; private String 班级; private char 性别; private int 年龄; public Student(int a, String b, String c, char d, int e) { 学号= a; 姓名= b; 班级= c; 性别= d; 年龄= e; } public Strudent() { this(0, "张三" ,"软件0901" ,'男', 19); } public int get学号() { return 学号; } public String get姓名() { return 姓名; } public String get班级() { return 班级; } public char get性别() { return 性别; } public int get年龄()

{ return 年龄; } public void set学号(int a) { 学号=a; } public void set姓名(String a ) { 姓名=a; } public void set班级(String a) { 班级= a; } public void set性别( char a) { 性别= a ; } public void set年龄(int a) { 年龄= a; } public String toString() { return "该学生的学号为"+ 学号+ " 姓名为"+姓名+" 班级为"+班级+ " 性别为" +性别+ " 年龄为" +年龄"; } } 2、编程实现圆类,其中包括计算圆周长和面积的方法,并测试方法的正确性。 public class Yuan { private double X, Y, R; public Yuan(double a, double b, double c) { X=a; Y=b; R=c; } public double MianJi() { return 3.1416*R*R; } public double ZhouChang() { return 2*3.1416*R; } public static void main(String[] args) { Yuan s=new Yuan(2,3,4); System.out.println("该圆的面积是"+ s.MianJi()); System.out.println("该圆的周长是"+ s.ZhouChang()); } }

android 中对xml 进行解析

DOM解析器是通过将XML文档解析成树状模型并将其放入内存来完成解析工作的,而后对文档的操作都是在这个树状模型上完成的。这个在内存中的文档树将是文档实际大小的几倍。这样做的好处是结构清除、操作方便,而带来的麻烦就是极其耗费系统资源。而SAX正好克服了DOM的缺点,分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。 选择DOM 还是选择SAX,这取决于下面几个因素: 应用程序的目的:如果打算对数据作出更改并将它输出为XML,那么在大多数情况下,DOM 是适当的选择。并不是说使用SAX 就不能更改数据,但是该过程要复杂得多,因为您必须对数据的一份拷贝而不是对数据本身作出更改。 数据容量:对于大型文件,SAX 是更好的选择。 数据将如何使用:如果只有数据中的少量部分会被使用,那么使用SAX 来将该部分数据提取到应用程序中可能更好。另一方面,如果您知道自己以后会回头引用已处理过的大量信息,那么SAX 也许不是恰当的选择。 对速度的需要:SAX 实现通常要比DOM 实现更快。 基于上面的分析,在基于Android系统的内存和CPU资源比较有限的手持设备上,只要我们不需要修改XML数据或者随机的访问XML数据,SAX尽管可能需要更多的编码工作,但是为了更小的内存和CPU 消耗,还是值得的。 另外,Android SDK中已经包含了JAXP对应的javax.xml.parsers包,和SAX对应org.xml.sax(当然DOM对应的org.w3c.dom包也包含在内),加上Android还提供了android.sax这样的包来方便SAX Handle的开发,基于JAXP和SAX这样的标准方法来开发不仅复杂度不高,即使出现问题在讨论组中寻求解决方案也是比较容易的。 android 中的xml解析应该是和java中一条道路主要分为sax 解析和的Dom 解析。 如下的介绍的相关的包和类均为android 环境下: sax解析对应为: org\xml\sax 包:xml解析 javax.xml.parsers.SAXParserFactory javax.xml.parsers.SAXParser 两个主要用于SAXParser的上下文建立

C中类与类定义及具体使用方法

C中类与类定义及具体 使用方法 IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】

类模板 类模板也称为类属类或类生成类,是为类定义的一种模式,它使类中的一些数据成员和成员函数的参数或返回值可以取任意的数据类型。类模颁布是一个具体的类,它代表着一族类,是这一族类的统一模式。使用类模板就是要将它实例化为具体的类。 定义类模板的一般形式为: template class类名 { //…… } 其中,template是声明类模板的关键字;template后面的尖括号不能省略;数据类型参数标识符是类模板中参数化的类型名,当实例化类模板时,它将由一个具体的类型来代替。 定义类模板时,可以声明多个类型参数标识符,各标识符之间用逗号分开。 类定义中,凡要采用标准数据类型的数据成员、成员函数的参数或返回类型的前面都要加上类型标识符。 如果类中的成员函数要在类的声明之外定义,则它必须是模板函数。其定义形式为: template 数据类型参数标识符类名<数据类型参数标识符>∷函数名(数据类型参数标识符形参1,……,数据类型参数标识符形参n) { 函数体 } 模板类 将类模板的模板参数实例化后生成的具体的类,就是模板类。由类模板生成模板类的一般形式为:

类名<数据类型参数标识符>对象名1,对象名2,…,对象名n; 这里的数据类型参数标识符对应的是对象实际需要的数据类型。 应用举例 例函数模板的声明和模板函数的生成的例。 #include<> template//声明模板函数,T为数据类型参数标识符voidswap(T&x,T&y)//定义模板函数 { Tz;//变量z可取任意数据类型及模板参数类型T z=y; y=x; x=z; } voidmain() { intm=1,n=5; doublea=,b=; cout<<”m=”<

Delphi编译错误信息

***************************编译错误信息************************ ';' not allowed before 'ELSE' ElSE前不允许有“;” '' clause not allowed in OLE automation section 在OLE自动区段不允许“”子句 '' is not a type identifier 不是类型标识符 '' not previously declared as a PROPERTY 前面没有说明PROPERTY 'GOTO ' leads into or out of TRY statement GOTO 进入或超出TRY语句的范围 clause expected, but found 要求子句,但出现 16-Bit fixup encountered in object file '' 在对象文件遇到16位修复 486/487 instructions not enabled 不能用486/487指令 Abstract methods must be virtual or dynamic 抽象方法必须为虚拟的或动态的 Array type required 需要数组类型 Assignment to FOR-Loop variable '' 给FOR循环变量赋值 Bad argument type in variable type array constructor 在变量类型数组结构中不正确的参数类型 Bad file format '' 错误的文件格式 Bad file format: 错误的文件格式 Bad global symbol definition: '' in object file '' 对象文件''中错误的全局符号定义'' Bad unit format: 错误的单元格式 BREAK or CONTINUE outside of loop BREAK或CONTINUE超出循环 Cannot add or subtract relocatable symbols 不能增加或减少可重置的符号 Cannot assign to a read-only property 不能指定只读属性 Cannot BREAK, CONTINUE or EXIT out of a FINALLY clause 超出FINALLY子句的范围,不能使用BREAK,CONTINUE或EXIT语句 Cannot initialize local variables 不能初始化局部变量 Cannot initialize multiple variables 不能初始化多个变量 Cannot initialize thread local variables 不能初始化线程局部变量 Cannot override a static method 不能覆盖静态方法 Cannot read a write-only property 不能读取只写属性 Case label outside of range of case expression CASE标号超出了CASE表达式的范围 Circular unit reference to 对单元循环引用

XML创建与解析常用方法介绍

XML解析方式介绍 1.DOM4J(Document Object Model for Java) 虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具有并行访问功能。从2000下半年开始,它就一直处于开发之中。 为支持所有这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections 类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了比JDOM大得多的灵活性。 在添加灵活性、XPath集成和对大文档处理的目标时,DOM4J的目标与JDOM是一样的:针对Java 开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案,实现在本质上处理所有Java/XML问题的目标。在完成该目标时,它比JDOM更少强调防止不正确的应用程序行为。 DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用DOM4J. 【优点】 ①大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。 ②支持XPath。 ③有很好的性能。 【缺点】 ①大量使用了接口,API较为复杂。 2.SAX(Simple API for XML) SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。 选择DOM还是选择SAX?对于需要自己编写代码来处理XML文档的开发人员来说,选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX 采用的是事件模型。

四中最常用的XML文件解析总结

XML文件学习总结 掌握了XML文件解析的常用的4中方式:DOM解析、SAX 解析、STAX解析以及DOM4j解析XML文件。 一、DOM 解析xml文件 public List parse(String url) throws Exception{ // 1、创建解析工厂 D ocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//创建工厂是单例模式,不能直接new对象,需要调用newInstance来创建对象。 // 2、创建解析器 D ocumentBuilder builder = factory.newDocumentBuilder(); // 3、创建解析器的url F ile file = new File(url); // 4、得到解析后的Document对象 D ocument doncument = builder.parse(file); // 5、通过得到节点名字得到所有同名节点的集合NodeList N odeList nodeList = doncument.getElementsByTagName("student"); // 6、遍历NodeList集合 f or (int i = 0; i < nodeList.getLength(); i++) { // 得到每个节点对象 Node studentNode = nodeList.item(i); Student st = new Student(); NamedNodeMap map = studentNode.getAttributes(); //for(int j=0;j

Delphi中错误信息对照表.

Delphi中错误信息对照表 ""not previously declared as a PROPERTY 前面没有说明PROPERTY ''GOTO "leads into or out of TRY statement GOTO进入或超出TRY语句的范围 clause expected, but found 要求子句,但岀现 16-Bit fixup encountered in object file "" 在对象文件遇到16位修复486/487 instructions not enabled 不能用486/487 指 令 Abstract methods must be virtual or dynamic 抽象方法必须为虚 拟的或动态的 Array type required 需要数组类型Assignment to FOR-Loop variable "" 给FOR循环变量赋值 Bad argument type in variable type array constructor 在变量类型数组结 构中不正确的参数类型 Bad file format '''' 错误的文件格式 Bad file format: 错误的文件格式 Bad global symbol definition: "" in object file "" 对象文件"”中错误的全局符号定义”" Bad unit format: 错误的单元格式 BREAK or CONTINUE outside of loop BREAK 或CONTINUE超出循环 Cannot add or subtract relocatable symbols 不能增加或减少可 重置的符号 Cannot assign to a read-only property 不能指定只读属性Cannot BREAK, CONTINUE or EXIT out of a FINALLY clause 超出FINALLY 子句的范围,不能使用BREAK,CONTINUE 或EXIT语句 Cannot initialize local variables 不能初始化局部变量Cannot initialize multiple variables 不能初始化多个变量Cannot initialize thread local variables 不能初始化线程局部变 量 Cannot override a static method 不能覆盖静态方法Cannot read a write-only property 不能读取只写属性Case label outside of range of case expression CASE标号超出了 CASE表达式的范围 对单元循环引用 Circular unit reference to Class already has a default property 类已具有默认的属性Class does not have a default property 类没有默认的属性Class or object types only allowed in type section 在类型区段只允许有 类或对象类型 Class type required 需要类类型 Close error on 文件关闭错误 Compile terminated by user 用户中止编译Constant expected 要求常量

实验6 类的定义与使用--练习

实验6 类的定义与使用 一、实验目的和任务 类的定义与使用 1)掌握类的概念、定义格式、类与结构的关系、类的成员属性和类的封装性; 2)掌握类对象的定义; 3)理解类的成员的访问控制的含义,公有、私有和保护成员的区别; 4)掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数; 二、实验原理介绍 通过建立类及对象,用类的成员函数和对象访问类的成员; 利用建立类的构造函数,完成类的成员的初始化工作; 三、实验设备介绍 软件需求: Visual C++ 6.0 四、实验内容和步骤 1、声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,有两个公有成员函数run、stop。其中rank为枚举类型,声明为enum CPU_Rank { p1=1,p2,p3,p4,p5,p6,p7},frequency为单位是MHz的整形数,voltage为浮点型的电压值。观察构造函数和析构函数的调用顺序。 2、声明一个简单的Computer类,有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,有两个公有成员函数run、stop。cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,声明并实现这个类。 3、(选做)设计一个用于人事管理的People(人员)类。考虑到通用性,这里只抽象出所有类型人员都具有的属性:number(编号)、sex(性别)、birthday(出生日期)、id(身份证号)等等。其中“出生日期”声明为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数。组合。 思考题 1、注意类的定义; 2、类的成员函数的访问方式; 五、注意事项和要求 要求学生要提前准备实验的内容 实验完成后要求写出实验报告

Delphi常见错误代码

Delphi常见错误代码及中文解释 ';' not allowed before 'ELSE' ElSE前不允许有“;” '' clause not allowed in OLE automation section 在OLE自动区段不允许“”子句 '' is not a type identifier 不是类型标识符 '' not previously declared as a PROPERTY 前面没有说明PROPERTY 'GOTO

类的定义与使用

一、实验目的和任务 类的定义与使用 1)掌握类的概念、定义格式、类与结构的关系、类的成员属性和类的封装性; 2)掌握类对象的定义; 3)理解类的成员的访问控制的含义,公有、私有和保护成员的区别; 4)掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。能够根据给定的要求定义类并实现类的成员函数; 二、实验原理介绍 验证性实验; 通过建立类及对象,用类的成员函数和对象访问类的成员; 利用建立类的构造函数,完成类的成员的初始化工作; 三、实验设备介绍 软件需求: Visual C++ 6.0 四、实验内容 1、声明一个CPU类,包含等级(rank)、频率(freauency)、电压(voltage)等属性,有两个公有成员函数run、stop。其中rank为枚举类型,声明为enum CPU_Rank { p1=1,p2,p3,p4,p5,p6,p7},frequency为单位是MHz的整形数,voltage为浮点型的电压值。观察构造函数和析构函数的调用顺序。 实验原理:构造CPU类私有成员为等级(rank)、频率(freauency)、电压(voltage),其中rank为枚举类型,声明为enum CPU_Rank { p1=1,p2,p3,p4,p5,p6,p7},然后设置public 的构造函数CPU,有频率和电压。使频率f等于形参x,电压u等于y,此为构造的函数。然后运用析构函数,其符号为~,运用析构函数。一个类只能定义一个析构函数,析构函数

没有形参,且其顺序较特殊,对于含有多个对象的程序,先创建的对象后析构,后创建的对象先析构。所以析构函数出现在最后。此程序中,三个对象CPU run stop ,CPU析构,在主函数中运行了构造函数,run stop执行后析构。 实验源程序: #include class CPU {private: int f; double u; enum CPU_Rank{P1=1,P2,P3,P4,P5,P6,P7}; public: CPU(int x,double y) { f=x; u=y; cout<<"调用构造函数"<<"f="< studentname 78 78 98 studentname 77 68 88 JAVA文件: import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; /** *DOM4j对xml文件的操作 *操作DOM4j的时候注意要导入3个jar包,否则会报异常 *dom4j-1.6.1.jar *jaxen-1.1-beta-6.jar *saxpath.jar **/ public class ReaderDom4j {

delphi 下 用assert 来完成错误的捕捉

delphi 下用assert 来完成错误的捕捉 delphi 下用assert 来完成错误的捕捉 Assert 过程原形procedure Assert (expr :Boolean [; const msg: string]);在system.pas 里Assert 的实现是: procedure _Assert(const Message, Filename: AnsiString; LineNumber: Integer); {$IFDEF PUREPASCAL} begin if Assigned(AssertErrorProc) then AssertErrorProc(Message, Filename, LineNumber, Pointer(-1)) else Error(reAssertionFailed); // loses return addressend; {$ELSE} asm PUSH EBX {$IFDEF PIC} PUSH EAX PUSH ECX CALL GetGOT MOV EBX, EAX

MOV EAX, [EBX]. AssertErrorProc CMP [EAX], 0 POP ECX POP EAX {$ELSE} CMP AssertErrorProc,0{$ENDIF} JNZ @@1 MOV AL,reAssertionFailed CALL Error JMP @@exit @@1: PUSH [ESP+4].Pointer {$IFDEF PIC} MOV EBX, [EBX].AssertErrorProc CALL [EBX] {$ELSE} CALL AssertErrorProc {$ENDIF} @@exit: POP EBX end; {$ENDIF} 可以看出AssertErrorProc() 是没有初值的,通过对其赋值可以定义自己的Assert处理过程,

C中类与类定义及具体使用方法

类模板 类模板也称为类属类或类生成类,是为类定义的一种模式,它使类中的一些数据成员和成员函数的参数或返回值可以取任意的数据类型。类模颁布是一个具体的类,它代表着一族类,是这一族类的统一模式。使用类模板就是要将它实例化为具体的类。 定义类模板的一般形式为: template class 类名 { //…… } 其中,template是声明类模板的关键字;template后面的尖括号不能省略;数据类型参数标识符是类模板中参数化的类型名,当实例化类模板时,它将由一个具体的类型来代替。 定义类模板时,可以声明多个类型参数标识符,各标识符之间用逗号分开。 类定义中,凡要采用标准数据类型的数据成员、成员函数的参数或返回类型的前面都要加上类型标识符。 如果类中的成员函数要在类的声明之外定义,则它必须是模板函数。其定义形式为: template 数据类型参数标识符类名<数据类型参数标识符>∷函数名(数据类型参数标识符形参1,……,数据类型参数标识符形参n) { 函数体 } 模板类 将类模板的模板参数实例化后生成的具体的类,就是模板类。由类模板生成模板类的一般形式为: 类名<数据类型参数标识符>对象名1,对象名2,…,对象名n;

这里的数据类型参数标识符对应的是对象实际需要的数据类型。 6.4 应用举例 例6.1 函数模板的声明和模板函数的生成的例。 #include template //声明模板函数,T为数据类型参数标识符void swap(T &x, T &y) //定义模板函数 { T z; //变量z可取任意数据类型及模板参数类型T z=y; y=x; x=z; } void main() { int m=1,n=5; double a=8.9,b=3.4; cout<<”m=”< const int size=10; template

相关主题
文本预览
相关文档 最新文档