由于官方提供的TXMLDocument组件并不是特别好用,有着体积大,速度慢,调用不方便等缺点。
这里直接利用封装好的XML 解析库来对Xml数据进行解析与生成。
文章目录
1、生成XML文件
js
procedure TForm1.FormShow(Sender: TObject);
var
Xml: TXmlVerySimple;
BookNode, EntityNode: TXmlNode;
begin
// 创建一个新的XML文档
Xml := TXmlVerySimple.Create;
// 添加一个新的子节点,第一个子节点是DocumentElement
Xml.AddChild('books');
// 在文档根节点下添加一个新的书籍节点
BookNode := Xml.DocumentElement.AddChild('book');
// 添加一个名为'id'的属性
BookNode.Attributes['id'] := 'bk101';
// 创建作者和标题的子节点
EntityNode := BookNode.AddChild('author');
EntityNode.Text := 'Gambardella, Matthew';
EntityNode := BookNode.AddChild('title');
EntityNode.Text := 'XML Developer''s Guide';
/* 更简短的创建作者和标题的子节点
BookNode.AddChild('author').Text := 'Gambardella, Matthew';
BookNode.AddChild('title').Text := 'XML Developer''s Guide';*/
/* 更简短的创建作者和标题的子节点(同上)
Xml.DocumentElement.AddChild('book').SetAttribute('id', 'bk101').AddChild('author').
SetText('Gambardella, Matthew').Parent.AddChild('title').Text := 'XML Developer''s Guide';*/
// 将内容写入Memo,前3个字符是Unicode BOM
Memo1.Lines.Text := Xml.Text;
// 写入到文件
Xml.SaveToFile('example1.xml');
// 释放资源
Xml.Free;
end;
生成XML内容如下:
xml
<?xml version="1.0" encoding="utf-8"?>
<books>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
</book>
</books>
2、解析XML文件
js
procedure TForm1.FormShow(Sender: TObject);
var
Xml: TXmlVerySimple;
BookNode, EntityNode: TXmlNode;
Books: TXmlNodeList;
I: Integer;
begin
// 首先创建一个XML文档,并保存
Xml := TXmlVerySimple.Create;
Xml.AddChild('books');
for I := 1 to 3 do
begin
Xml.DocumentElement.AddChild('book').SetAttribute('id', 'bk101-' + IntToStr(I)).AddChild('author').
SetText('Gambardella, Matthew').Parent.AddChild('title').Text := 'XML Developer''s Guide Part ' + IntToStr(I);
end;
Xml.DocumentElement.AddChild('book').SetAttribute('id', 'bk103').AddChild('author').
SetText('Corets, Eva').Parent.AddChild('title').Text := 'Maeve Ascendant';
Xml.SaveToFile('example4.xml');
Xml.Free;
// 现在尝试加载它
Xml := TXmlVerySimple.Create;
Xml.LoadFromFile('example4.xml');
// FindNodes 返回一个节点列表
Books := Xml.DocumentElement.FindNodes('book');
for BookNode in Books do
begin
Memo1.Lines.Add('书籍: ' + BookNode.Attributes['id']);
// 定位'title'节点并将其内容写入Memo
EntityNode := BookNode.Find('title');
if Assigned(EntityNode) then
Memo1.Lines.Add('标题: ' + EntityNode.Text);
// 定位'author'节点并将其内容写入Memo
EntityNode := BookNode.Find('author');
if Assigned(EntityNode) then
Memo1.Lines.Add('作者: ' + EntityNode.Text);
Memo1.Lines.Add('');
end;
Books.Free;
// 释放资源
Xml.Free;
end;
返回:
Book: bk101-1
Title: XML Developer's Guide Part 1
Author: Gambardella, Matthew
Book: bk101-2
Title: XML Developer's Guide Part 2
Author: Gambardella, Matthew
Book: bk101-3
Title: XML Developer's Guide Part 3
Author: Gambardella, Matthew
Book: bk103
Title: Maeve Ascendant
Author: Corets, Eva
3、生成带注释的XML文件
js
procedure TForm1.FormShow(Sender: TObject);
var
Xml: TXmlVerySimple;
begin
// 首先创建一个XML文档,并保存
Xml := TXmlVerySimple.Create;
Xml.AddChild('books');
// 添加一个新的注释节点,节点名称为空,因为在输出时不使用
Xml.DocumentElement.AddChild('', ntComment).Text := ' 这是第一本书 ';
// 添加一本书
Xml.DocumentElement.AddChild('book').SetAttribute('id', 'bk101').AddChild('author').
SetText('Gambardella, Matthew').Parent.AddChild('title').Text := 'XML Developer''s Guide';
// 添加一个新的注释节点,节点名称为空,因为在输出时不使用
Xml.DocumentElement.AddChild('', ntComment).Text := ' 这是第二本书 ';
// 添加一本书
Xml.DocumentElement.AddChild('book').SetAttribute('id', 'bk103').AddChild('author').
SetText('Corets, Eva').Parent.AddChild('title').Text := 'Maeve Ascendant';
// 将内容写入Memo,前3个字符是Unicode BOM
Memo1.Lines.Text := Xml.Text;
// 写入到文件
Xml.SaveToFile('example5.xml');
// 释放资源
Xml.Free;
end;
返回:
xml
<?xml version="1.0" encoding="utf-8"?>
<books>
<!-- 这是第一本书 -->
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
</book>
<!-- 这是第二本书 -->
<book id="bk103">
<author>Corets, Eva</author>
<title>Maeve Ascendant</title>
</book>
</books>
4、删除XML文件节点
js
procedure TForm1.FormShow(Sender: TObject);
var
Xml: TXmlVerySimple;
Node: TXmlNode;
CommentNodes: TXmlNodeList;
begin
// 首先创建一个XML文档,并保存
Xml := TXmlVerySimple.Create;
Xml.AddChild('books');
// 添加一个新的注释节点,节点名称为空,因为在输出时不使用
Xml.DocumentElement.AddChild('', ntComment).Text := ' 这是第一本书 ';
// 添加一本书
Xml.DocumentElement.AddChild('book').SetAttribute('id', 'bk101').AddChild('author').
SetText('Gambardella, Matthew').Parent.AddChild('title').Text := 'XML Developer''s Guide';
// 添加一个新的注释节点,节点名称为空,因为在输出时不使用
Xml.DocumentElement.AddChild('', ntComment).Text := ' 这是第二本书 ';
// 添加一本书
Xml.DocumentElement.AddChild('book').SetAttribute('id', 'bk103').AddChild('author').
SetText('Corets, Eva').Parent.AddChild('title').Text := 'Maeve Ascendant';
// 现在删除所有注释节点(位于DocumentElement根的第一级)
CommentNodes := Xml.DocumentElement.FindNodes('', [ntComment]);
// 要删除一个节点,只需从其父节点中移除它(不要在未从父节点中删除的情况下释放它!)
for Node in CommentNodes do
Node.Parent.ChildNodes.Remove(Node);
CommentNodes.Free;
// 将内容写入Memo,前3个字符是Unicode BOM
Memo1.Lines.Text := Xml.Text;
// 写入到文件
Xml.SaveToFile('example6.xml');
// 释放资源
Xml.Free;
end;