【Delphi 爬虫库 4】使用封装好的 XML 解析库对 XML 数据进行解析

由于官方提供的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;
相关推荐
一条晓鱼3 小时前
repo xml语法
xml
加油20197 小时前
音视频处理(三):hls协议和m3u8详解和视频下载爬虫实战
爬虫·音视频·hls·m3u8·mpeg-2·mpeg2-ts·电视迷
闲人编程12 小时前
从零开发一个简单的Web爬虫(使用Requests和BeautifulSoup)
前端·爬虫·beautifulsoup·bs4·web·request·codecapsule
B站计算机毕业设计之家13 小时前
大数据python招聘数据分析预测系统 招聘数据平台 +爬虫+可视化 +django框架+vue框架 大数据技术✅
大数据·爬虫·python·机器学习·数据挖掘·数据分析
疏狂难除15 小时前
spiderdemo第22题与webassembly的跨域
开发语言·javascript·爬虫·rust·wasm·mitmproxy
小白学大数据18 小时前
增量爬取策略:如何持续监控贝壳网最新成交数据
爬虫·python·性能优化
苏打水com1 天前
Python 爬虫 3 大核心库深度解析:从原理到实战,覆盖 90% 爬取场景
爬虫
深蓝电商API1 天前
数据清洗标准化:构建可复用的爬虫数据清洗管道(Pipeline)
爬虫·数据清洗
深蓝电商API1 天前
“监狱”风云:如何设计爬虫的自动降级与熔断机制?
爬虫
萝卜白菜。1 天前
关于Java EE应用中xml解析类的问题
xml·java·java-ee