【Delphi 爬虫库 4】使用封装好的 XML 解析库对 XML 数据进行解析
由于官方提供的TXMLDocument组件并不是特别好用,有着体积大,速度慢,调用不方便等缺点。
这里直接利用封装好的XML 解析库来对Xml数据进行解析与生成。
文章目录
- 1、生成XML文件
- 2、解析XML文件
- 3、生成带注释的XML文件
- 4、删除XML文件节点
1、生成XML文件
procedure TForm1.FormShow(Sender: TObject);
varXml: TXmlVerySimple;BookNode, EntityNode: TXmlNode;
begin// 创建一个新的XML文档Xml := TXmlVerySimple.Create;// 添加一个新的子节点,第一个子节点是DocumentElementXml.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 BOMMemo1.Lines.Text := Xml.Text;// 写入到文件Xml.SaveToFile('example1.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>
</books>
2、解析XML文件
procedure TForm1.FormShow(Sender: TObject);
varXml: TXmlVerySimple;BookNode, EntityNode: TXmlNode;Books: TXmlNodeList;I: Integer;
begin// 首先创建一个XML文档,并保存Xml := TXmlVerySimple.Create;Xml.AddChild('books');for I := 1 to 3 dobeginXml.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 dobeginMemo1.Lines.Add('书籍: ' + BookNode.Attributes['id']);// 定位'title'节点并将其内容写入MemoEntityNode := BookNode.Find('title');if Assigned(EntityNode) thenMemo1.Lines.Add('标题: ' + EntityNode.Text);// 定位'author'节点并将其内容写入MemoEntityNode := BookNode.Find('author');if Assigned(EntityNode) thenMemo1.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, MatthewBook: bk101-2
Title: XML Developer's Guide Part 2
Author: Gambardella, MatthewBook: bk101-3
Title: XML Developer's Guide Part 3
Author: Gambardella, MatthewBook: bk103
Title: Maeve Ascendant
Author: Corets, Eva
3、生成带注释的XML文件
procedure TForm1.FormShow(Sender: TObject);
varXml: 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 BOMMemo1.Lines.Text := Xml.Text;// 写入到文件Xml.SaveToFile('example5.xml');// 释放资源Xml.Free;
end;
返回:
<?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文件节点
procedure TForm1.FormShow(Sender: TObject);
varXml: 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 doNode.Parent.ChildNodes.Remove(Node);CommentNodes.Free;// 将内容写入Memo,前3个字符是Unicode BOMMemo1.Lines.Text := Xml.Text;// 写入到文件Xml.SaveToFile('example6.xml');// 释放资源Xml.Free;
end;
相关文章:
【Delphi 爬虫库 4】使用封装好的 XML 解析库对 XML 数据进行解析
由于官方提供的TXMLDocument组件并不是特别好用,有着体积大,速度慢,调用不方便等缺点。 这里直接利用封装好的XML 解析库来对Xml数据进行解析与生成。 文章目录 1、生成XML文件2、解析XML文件3、生成带注释的XML文件4、删除XML文件节点 1、生…...
Flask简介
Flask简介 安装概述使用PyCharm创建一个Flask程序 Flask程序的基本结构初始化路由和视图函数启动服务器请求-响应循环 安装 概述 Flask算是小型框架,小到可以称为“微框架”。Flask 非常小,因此你一旦能够熟练使用它,很可能就能读懂它所有的…...
神经网络中的归一化
我们今天介绍一下神经网络中的归一化方法~ 之前学到的机器学习中的归一化是将数据缩放到特定范围内,以消除不同特征之间的量纲和取值范围差异。通过将原始数据缩放到一个特定的范围内,比如[0,1]或者[-1,1],来消除不同特征之间的量纲和取值范围…...
《从Paxos到Zookeeper》——第四、七章:基本概念及原理
目录 第四章 Zookeeper与Paxos 4.1 Zk是什么 4.1.1 Zk特性 4.1.2 Zk基本概念 4.1.2.1 集群角色(Follower, Leader, Observer) 4.1.2.2 数据模型 4.1.2.3 ZNode(数据节点) 4.1.2.4 Session(会话) 4.1.2.5 ACL(Access Control Lists) 4.1.2.6 Watcher(事件…...
网络演进技术演进:裸纤专线、SDH、MSTP+、OTN、PTN、IP-RAN
前言 文章主要介绍常见名词以及其在各自领域实现的功能价值。 01 裸纤 裸光纤(裸光纤)由运营商提供,是无中继的光纤线路,仅通过配线架连接。相比传统光纤,裸光纤提供纯粹的物理传输路径,无需额外网…...
MMC设备
MMC(MultiMediaCard)是一种闪存卡标准,用于作为便携式设备上的存储媒介,例如数码相机、智能手机、平板电脑、个人数字助理(PDA)以及其他便携式设备。MMC卡最初是由SanDisk和Siemens AG开发的,并…...
图片浏览器-PicView
一、前言 PicView 是一款适用于 Windows 10 或 11 的快速高效的图像查看器,配备了干净简洁的用户界面,可以在不需要时方便地隐藏。 二、支持类型 它支持广泛的图像文件类型,包括:WEBP、GIF、SVG、PNG、JXL、HEIC、PSD 三、软件特…...
一些零碎小知识
函数递归复习 #define 的头文件包含 #define定义标识符常量 等define其他用法 斐波那契数列 函数栈帧 青蛙跳台问题 汉诺塔问题 字符“0”与0的计算 “0”-“0”0; 最后一次作业题一道 素数 随机数 strand timer rand 水仙花数 变种随鲜花 斐波那契数…...
2.2 Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue基本语法
文本渲染指令 文本渲染指令-v-html与v-text Vue使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层Vue实例的数据。所有Vue的模板都是 合法的HTML,所以能被遵循规范的浏览器和HTML解析器解析。 在前面,我们一直使用的是字符串插…...
(Arxiv,2024)Mind the Modality Gap:通过跨模态对齐建立遥感视觉语言模型
文章目录 相关资料摘要引言相关工作对比语言图像预训练遥感域专用 CLIP 模型遥感中的多模态 CLIP 启发模型 方法模型算法输入阶段:输出阶段:步骤说明: 第一阶段:通过权重插值修补CLIP将遥感图像模态与自然图像和文本对齐 实验 相关…...
区块链 | 一文了解 NFT 的生态系统(上)
🐶原文: Understanding Security Issues in the NFT Ecosystem 🐶写在前面: 本博客只摘取了原论文的第二、三节。 技术背景知识 在本节中,我们将介绍以太坊生态系统的构建模块,重点关注「NFT,…...
为什么centos官方版不支持arm架构?
为什么centos官方版不支持arm架构? 1、资源限制:CentOS是由社区维护的开源操作系统,其开发和维护需要大量的人力和物力资源。由于ARM架构的设备相对较少,社区资源有限,因此官方版CentOS选择集中精力在x86架构上进行开发…...
awk小尝试2(随手记)
文章目录 需求1解法 需求2解法(3种-grep/sed/awk) 需求1 使用hostname -I创建文件名 echo hostname -I.txt 10.0.0.124 .txt # 需要注意,这里的.txt前有一个空格,需要去掉,不然就是两个文件名解法 echo hostname -I…...
Vue的项目启动指令分析
通过Vue CLI脚手架创建的项目,默认的启动项目方式是 npm run serve 这里的serve是可以修改的。 在创建的项目目录中,找到package.json 双击打开,找到scripts部分 在scripts部分,有一个"serve"键值对,这里的…...
年轻人刮疯了,刮刮乐断货了
年轻人刮疯了 刮刮乐缺货了。 00后彩票店老板陆诗等得有点着急。她的福彩店开在深圳,今年4月才开门营业,但从开业到今天,刮刮乐总共就来了一回货——开业时发的20本。 那之后,刮刮乐就彻底断供了。原本,陆诗想把刮刮…...
25 JavaScript学习:var let const
JavaScript全局变量 JavaScript中全局变量存在多种情况和定义方式,下面详细解释并提供相应的举例: 使用var关键字声明的全局变量: var globalVar "我是全局变量";未使用var关键字声明的变量会成为全局变量(不推荐使用&…...
docker部署的nacos2.2x开启鉴权功能
注意在2.2.0版本之后如果不开启鉴权,那么默认不需要登录就可以访问 所以我们需要手动开启鉴权,nacos启动好以后来到容器内部修改 docker exec -it nacos /bin/shvim conf/application.properties在第34行下面添加 nacos.core.auth.enabledtrue nacos.cor…...
【数据结构与算法】之五道链表进阶面试题详解!
目录 1、链表的回文结构 2、相交链表 3、随机链表的复制 4、环形链表 5、环形链表(||) 6、完结散花 个人主页:秋风起,再归来~ 数据结构与算法 个人格言:悟已往之不谏,知…...
vue2实现生成二维码和复制保存图片功能(复制的同时会给图片加文字)
<template><divstyle"display: flex;justify-content: center;align-items: center;width: 100vw;height: 100vh;"><div><!-- 生成二维码按钮和输入二维码的输入框 --><input v-model"url" placeholder"输入链接" ty…...
Redis之字符串类型深入之SDS底层结构
作为一名程序员不可能不知道redis 知道redis不可能不知道redis的字符串 如果你真的熟悉redis不能不知道sds, 我们探究一下redis字符串的底层结构 sds翻译过来就是动态扩容(Simple Dynamic String)、先看一下最早版本redis的sds结构体 struct sdshdr{int len; //记录数组中…...
Screenbox:Windows平台媒体播放体验革新的开源解决方案
Screenbox:Windows平台媒体播放体验革新的开源解决方案 【免费下载链接】Screenbox LibVLC-based media player for the Universal Windows Platform 项目地址: https://gitcode.com/gh_mirrors/sc/Screenbox 副标题:3大核心优势4类应用场景5分钟…...
嵌入式代码比对:单片机固件版本差异分析与工具选型
1. 单片机开发中的代码版本比对:工程实践与工具选型在嵌入式硬件开发流程中,代码版本管理远非仅限于“保存多个副本”的简单操作。当一个基于STM32F407的电机控制固件从v1.2升级至v1.3,或ESP32-WROVER模组的Wi-Fi配网逻辑在三次迭代后发生结构…...
RS-485接口实战避坑指南:从终端电阻到EMC防护的完整配置流程
RS-485接口实战避坑指南:从终端电阻到EMC防护的完整配置流程 在工业自动化现场调试中,RS-485总线的稳定性往往决定着整个系统的可靠性。记得去年参与某钢铁厂轧机控制系统改造时,一个简单的终端电阻配置错误导致整条产线通信中断8小时——这种…...
B端拓客号码核验困境破解:行业痛点审视与技术赋能路径氪迹科技法人股东号码核验系统
在B端客户拓展的实践过程中,企业法人、股东及核心决策人号码的核验与筛选,是所有拓客团队都必须面对的关键前置工作。人工手动筛选不仅消耗大量人力与时间成本,更无法适配规模化拓客的发展需求;而借助工具开展核验,又往…...
青岑CTF MISC 我不要革命失败 Writeup
题目信息 - 题目名称:我不要革命失败题目类型:MISC题目分值:500题目描述:小吉的机械革命笔记本又双叒叕蓝屏了!这次他不想再坐以待毙!他发来了他在 C:\Windows\Minidump\ 下的蓝屏文件,请你帮忙…...
LCD I2C驱动库:面向嵌入式MCU的HD44780轻量级字符显示方案
1. 项目概述 LCD I2C 库是一个面向 PlatformIO 生态的轻量级嵌入式显示驱动库,专为基于 PCF8574 或 MCP23008 IC 扩展芯片的字符型 LCD 模块(如常见的 1602、2004 型号)设计。该库不依赖特定 HAL 层,采用纯 C 实现,通过…...
在树莓派直接安装LibreELEC镜像以便启动kodi
LibreELEC是一个开源的Linux发行版,核心软件是Kodi,也安装了足够多的软件包。该项目是从OpenELEC发展而来,旨在提供一个包含运行Kodi媒体中心软件的基本必需品的操作系统。 LibreELEC简单来说就是最小限度满足Kodi运行的Linux,Lib…...
终极指南:如何掌握ControlFlow工作流API设计——命令式与函数式编程范式解析
终极指南:如何掌握ControlFlow工作流API设计——命令式与函数式编程范式解析 【免费下载链接】ControlFlow 🦾 Take control of your AI agents 项目地址: https://gitcode.com/gh_mirrors/co/ControlFlow ControlFlow是一个强大的AI工作流管理框…...
WorkBuddy:腾讯版小农虾、操作简单、模型更强大就更好
“耳朵”和“大脑”(事件与规则模块):它时刻帮你盯着所有重要动静,比如你提交了代码、系统报了警。一旦发现情况,它就用你预设好的“如果…就…”规则,快速决定该做什么。“双手”(执行模块&…...
实际运行的资产和设备管理系统平台源码(Java)
1. 仓库管理固定资产存储与流转的基础,核心功能:管理仓库基础信息(增删改查)、划分库区便于定位;登记出入库信息并生成单据,关联资产档案;设置库存预警,及时提醒异常情况。2. 借用管…...
