Delphi编程之XML

添加控件XMLDocument。例子XML文件内容:(c:\temp\test.xml)

<!–StartFragment–><?xml version="1.0" encoding="gb2312"?>
<科室名单 备注="测试">

<人员 职务="科长" 备注="正局级">
    <姓名>张三</姓名>
    <性别>男</性别>
    <年龄>34</年龄>
</人员>

<人员 职务="付科长">
    <姓名>李四</姓名>
    <性别>女</性别>
    <年龄>43</年龄>
</人员>

<人员>
    <姓名>王五</姓名>
    <性别>女</性别>
    <年龄>25</年龄>
</人员>

<人员>
    <姓名>孙六</姓名>
    <性别>男</性别>
    <年龄>52</年龄>
</人员>

<辅助人员></辅助人员>

</科室名单>

打开1:

XMLDocument1.LoadFromFile(‘c:\temp\test.xml’);
Memo1.Lines := XMLDocument1.XML;                         {查看}

打开2:

XMLDocument1.FileName := ‘c:\temp\test.xml’;
XMLDocument1.Active := True;                             {激活}
Memo1.Lines := XMLDocument1.XML;                         {查看}

打开3:

ms := TMemoryStream.Create;
ms.LoadFromFile(‘c:\temp\test.xml’);
XMLDocument1.LoadFromStream(ms);
ms.Free;
Memo1.Lines := XMLDocument1.XML;                         {查看}

获取根目录下的元素数1:

XMLDocument1.LoadFromFile(‘c:\temp\test.xml’);
ShowMessage(IntToStr(XMLDocument1.DocumentElement.ChildNodes.Count)); {4}
                                                  {DocumentElement 是根节点}   {ChildNodes 是节点包含的子节点的列表}

获取根目录下的元素数2:

var nodeList:IXMLNodeList;                        {定义一个节点列表对象}
nodeList := XMLDocument1.DocumentElement.ChildNodes;
                                                  {把根节点下的子节点列表赋给节点列表对象}

获取元素内容:

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);                   {张三}
//访问第二个人的信息
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;

访问节点属性:

ShowMessage(IntToStr(XMLDocument1.DocumentElement.AttributeNodes.Count)); {1}
ShowMessage(XMLDocument1.DocumentElement.Attributes['备注']);             {测试}
{通过属性名访问属性, 一般用 Attributes['属性名']}
ShowMessage(XMLDocument1.DocumentElement.AttributeNodes[0].Text);         {测试}
{通过属性位置访问属性, 必须用 AttributeNodes[位置ID]}
{但通过 AttributeNodes['属性名'] 也可以访问属性, 譬如:}
ShowMessage(XMLDocument1.DocumentElement.AttributeNodes['备注'].Text);    {测试}
{AttributeNodes 是某个节点的属性列表, 它也是一个节点列表对象, 譬如:}
nodeList := XMLDocument1.DocumentElement.AttributeNodes;
node := nodeList[0];
ShowMessage(node.Text); {测试}
node := nodeList['备注'];
ShowMessage(node.Text); {测试}
//访问第二个人的属性信息
nodeList := XMLDocument1.DocumentElement.ChildNodes;
node := nodeList[1];
ShowMessage(IntToStr(node.AttributeNodes.Count)); {1}
ShowMessage(node.Attributes['职务']);             {副科长}
ShowMessage(node.AttributeNodes[0].Text);         {副科长}

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

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); {姓名}

添加与删除节点:

var newNode, newNodeAdd: IXMLNode;
newNode := XMLDocument1.DocumentElement.AddChild(‘人员’);
newNode.Attributes['职务'] := ‘秘书’;

newNodeAdd := newNode.AddChild(‘姓名’);
newNodeAdd.Text := ‘小翠’;

newNodeAdd := newNode.AddChild(‘性别’);
newNodeAdd.Text := ‘女’;

Memo1.Lines := XMLDocument1.XML; {查看}
{会在尾部增加:
<人员 职务="秘书"><姓名>小翠</姓名><性别>女</性别></人员>
}
//删除
procedure TForm1.Button2Click(Sender: TObject);
var
nodeList: IXMLNodeList;
begin
nodeList := XMLDocument1.DocumentElement.ChildNodes;
nodeList.Delete(nodeList.Count-1); {删除最后一条}

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

创建与保存 xml:

//利用 XML 属性创建 xml 文件
procedure TForm1.Button1Click(Sender: TObject);
begin
//XMLDocument1.Active := true;
XMLDocument1.XML.Add(‘<?xml version="1.0" encoding="gb2312"?>’);
XMLDocument1.XML.Add(‘<科室名单 备注="测试">’);
XMLDocument1.XML.Add(‘<人员 职务="科长" 备注="正局级">’);
XMLDocument1.XML.Add(‘<姓名>张三</姓名>’);
XMLDocument1.XML.Add(‘<性别>男</性别>’);
XMLDocument1.XML.Add(‘<年龄>34</年龄>’);
XMLDocument1.XML.Add(‘</人员>’);
XMLDocument1.XML.Add(‘</科室名单>’);

ShowMessage(XMLDocument1.XML.Text); {查看}
end;

//创建 xml 文件的标准方法
procedure TForm1.Button2Click(Sender: TObject);
var
pNode,cNode: IXMLNode; {定义两个节点: 父节点、子节点}
begin
XMLDocument1.Active := True;                {必须先激活}
XMLDocument1.Version := ’1.0′;              {设置版本}
XMLDocument1.Encoding := ‘GB2312′;          {设置语言}

pNode := XMLDocument1.AddChild(‘科室名单’); {添加的第一个节点是根节点, 现在的 pNode 是根节点}
pNode.SetAttribute(‘备注’, ‘测试’);         {为根节点设置属性}

pNode := pNode.AddChild(‘人员’);            {为根节点添加子节点, 现在的 pNode 是 "人员" 节点}
pNode.SetAttribute(‘职务’, ‘科长’);         {设置属性}
pNode.SetAttribute(‘备注’, ‘正局级’);

cNode := pNode.AddChild(‘姓名’); {为 pNode 添加子节点, 返回值 cNode 指向了新添加的节点}
cNode.Text := ‘张三’;

cNode := pNode.AddChild(‘性别’);
cNode.Text := ‘男’;

cNode := pNode.AddChild(‘年龄’);
cNode.Text := ’34′;

ShowMessage(XMLDocument1.XML.Text);         {查看}
end;

//保存
procedure TForm1.Button3Click(Sender: TObject);
begin
XMLDocument1.SaveToFile(‘c:\temp\0.xml’);
end;