【C++】POCO学习总结(十八):XML

news2024/11/26 4:24:13

【C++】郭老二博文之:C++目录

1、XML文件格式简介

1)XML文件的开头一般都有个声明,声明是可选

<?xml version="1.0" encoding="UTF-8"?>

2)根元素:XML文件最外层的元素

3)元素和属性:

<元素名elementName 属性attributeName = " attrValue " >
元素内容
< / elementName >

4)注释

<!——注释——>

5)处理指令,用的不多
详细解释参考博客:https://blog.csdn.net/gavin_john/article/details/51511180

<?name data?>

6)CDATA
用于转义包含字符的文本块,否则这些字符将被视为标记

<xml><!CDATA[Escape <things><like></that>]]></xml>

7)示例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<!--
	This is a comment.
-->

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
	<head>
		<link rel="stylesheet" href="styles.css" type="text/css"/>
		<?xml-stylesheet href="styles.css" type="text/css"?>
		<title>A XHTML Example</title>
	</head>
	<body>
		<h1>XHTML Example</h1>
		<p>This is a XHTML example page.</p>
		<img src="example.gif" width="256" height="192" alt="Example Picture" border="0"/>
		<![CDATA[
		The following <tag attr="value">is inside a CDATA section</tag>.
		]]>
	</body>
</html>

2、POCO的XML接口

2.1 说明

POCO支持两个接口来处理(读和写)XML数据:

  • XML的简单API(SAX),基于事件的处理
  • 文档对象模型,基于的处理

2.2 SAX基于事件处理的优点和缺点

1)优点:
基于事件处理非常类似于流媒体,分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。
2)缺点:
由于应用程序没有以任何方式存储数据,使用 SAX 来更改数据或在数据流中往后移是不可能的。

2.3 DOM基于树的优点和缺点

1)优点:
由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。
它可以在任何时候在树中上下导航,而不是像 SAX 那样是一次性的处理。
DOM 使用起来也要简单得多。

2)缺点:
在内存中构造这样的树涉及大量的开销。大型文件完全占用系统内存容量的情况并不鲜见。
创建一棵 DOM 树可能是一个缓慢的过程。

2.4 如何选择 SAX 和 DOM

选择 DOM 还是选择 SAX,这取决于下面几个因素:
1)应用程序的目的:如果打算对数据作出更改并将它输出为 XML,那么在大多数情况下,DOM 是适当的选择。并不是说使用 SAX 就不能更改数据,但是该过程要复杂得多,因为您必须对数据的一份拷贝而不是对数据本身作出更改。

2)数据容量: 对于大型文件,SAX 是更好的选择。
数据将如何使用:如果只有数据中的少量部分会被使用,那么使用 SAX 来将该部分数据提取到应用程序中可能更好。 另一方面,如果您知道自己以后会回头引用已处理过的大量信息,那么 SAX 也许不是恰当的选择。

3)对速度的需要: SAX 实现通常要比 DOM 实现更快。

3、SAX

3.1 说明

XML的简单API,简称为SAX,最初是java接口,POCO仿照java接口,使用C++来实现。

SAX是一个事件驱动的接口。XML文档不会作为一个整体加载到内存中进行解析。相反,解析器扫描XML文档,对于它找到的每个XML结构(元素、文本、处理指令等),调用处理程序对象的某个成员函数。
在这里插入图片描述

3.2 用法

1)属性
通过索引或名称访问属性值

2)内容事件:ContentHandler
常用接口:startElement()、endElement()、characters(),…

3)DTD处理事件:DeclHandler
一种简单的模式语言处理XML文件中的DTD声明
DTD是什么?Document Type Declaration:文档类型声明
用于XML文件中DTD声明的可选处理程序

example.dtd

<!ELEMENT people_list (person*)>
<!ELEMENT person (name, birthdate?, gender?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT birthdate (#PCDATA)>
<!ELEMENT gender (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE people_list SYSTEM "example.dtd">
<people_list>
 <person>
 <name>Peter Schojer</name>
 <birthdate>15/03/1976</birthdate>
 <gender>Male</gender>
 </person>
</people_list>

4)处理未被DeclHandler处理的DTD:DTDHandler

处理未被DeclHandler处理的DTD

  • 未解析的实体
  • 符号
  • startDocument和第一个startElement之间的所有报告

常用接口:notationDecl(), unparsedEntityDecl()

5)词法事件:LexicalHandler
SAX的可选扩展处理程序,用于提供关于XML文档的词法信息;
词法信息包括所使用的文档编码格式和嵌入文档中的 XML 注释,以及 DTD 和任何 CDATA 部分的节边界。

常用接口:startDTD(), endDTD(), startCDATA(), endCDATA(), comment()

4、DOM 文档对象模型

4.1 说明

DOM文档对象模型:是由万维网联盟(W3C)指定的一个API。
DOM使用XML文档的树表示;
整个文档必须加载到内存中;
可以直接修改XML文档。
在这里插入图片描述

4.2 在DOM中导航

1)节点信息

  • parentNode ():父节点
  • firstChild():第一个子节点
  • lastChild():最后一个子节点
  • nextSibling():下一个子节点(同级别的,兄弟姐妹)
  • previousSibling():前一个子节点(同级别的,兄弟姐妹)

2)节点迭代用于文档顺序遍历

  • nextNode():前一个节点
  • previousNode():后一个节点

3)支持节点过滤

4.3 DOM中的内存管理

DOM节点被引用计数。
如果创建一个新节点并将其添加到文档中,则文档将增加其引用计数。所以请使用AutoPtr。
可以通过 NamedNodeMap 和 NodeList 接口获得非树对象的所有权,所以必须释放它们(或使用AutoPtr)。
文档保留了从树中删除的节点的所有权。这些节点在文档的AutoReleasePool中结束。

4.4 创建XML文档

  • 从头开始构建DOM文档
  • 通过使用XMLWriter类,
    XMLWriter支持生成XML数据的SAX接口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1319438.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不同vlan设备互通案例操作介绍

目录 一、案例示图需求 1. 示图 2. 需求 二、操作演示 1. 接入层交换机SW4、SW5划分vlan 2. 汇聚层交换机SW2、SW3配置IP作为vlan网关、与SW1直连 3. 核心交换机SW1配置IP与汇聚交换机、R1直连 4. SW1、SW2、SW3、R1配置静态路由&#xff0c;使得vlan10、vlan20、172网…

Vue项目使用WebAssembly之后,Nginx如何解决WebAssembly不支持的问题

在VUE项目中使用WebAssembly之后&#xff0c;打包的项目会出现下面的错误 Uncaught (in promise) TypeError: WebAssembly: Response has unsupported MIME type application/wasm; charsetutf-8 expected application/wasm 可以用以下办法解决 一&#xff1a;单独Nginx配置…

YK3150滚齿机电池式绝对编码器电压过低导致丢失多圈数据,如何清多圈

当驱动器电池没电了&#xff0c; 就会报警如下 C轴驱动器&#xff1a;041&#xff08;0x29&#xff09; 电池式绝对编码器电压过低导致丢失多圈数据 此时需要换电池后&#xff0c;进行【清多圈】操作&#xff0c;先把【伺服参数开关】打开&#xff08;一定要记得&#xff09…

Pycharm 如何更改成中文版| Python循环语句| for 和 else 的搭配使用

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

音视频:Ubuntu下安装 FFmpeg 5.0.X

1.安装相关依赖 首可选一&#xff1a; sudo apt-get update sudo apt-get install build-essential autoconf automake libtool pkg-config \libavcodec-dev libavformat-dev libavutil-dev \libswscale-dev libresample-dev libavdevice-dev \libopus-dev libvpx-dev libx2…

自动化测试Selenium node 配置

查看自己chrome浏览器的版本 下载chromedriver对应版本&#xff0c;下载当前版本中最大版本。 https://npm.taobao.org/mirrors/chromedriver 安装java jdk &#xff0c;版本至少1.7, 并配置jdk环境变量 以下2个文件放在同一个目录下 Cmd地址切换到第四点目录下&#xff0c;然…

剑指 Offer(第2版)面试题 36:二叉搜索树与双向链表

剑指 Offer&#xff08;第2版&#xff09;面试题 36&#xff1a;二叉搜索树与双向链表 剑指 Offer&#xff08;第2版&#xff09;面试题 36&#xff1a;二叉搜索树与双向链表解法1&#xff1a;中序遍历 - 递归解法2&#xff1a;中序遍历 - 迭代 剑指 Offer&#xff08;第2版&am…

智能电力监控管理系统在物业小区的应用——安科瑞 顾烊宇

0引言 由于部分住宅小区存在电力设施纸质档案破损缺失、产权分界不清、查找故障点所在箱变&#xff08;箱式变电站&#xff0c;下同&#xff09;位置困难或小区出入口路径不明等情况&#xff0c;影响了抢修效率。为此&#xff0c;国网辽宁沈阳市沈北新区供电公司依托原有GIS平台…

C/C++ STL提供的关联式容器之set

set&#xff08;集合&#xff09;顾名思义&#xff0c;就是数学上的集合 —— 每个元素最多只出现一次&#xff0c;并且 set 中的元素已经从小到大排好序。 特点 1. 使用红黑树实现&#xff0c;其内部元素依据其值自动排序&#xff0c;每个元素值只能出现一次&#xff0c;…

海思平台isp之raw图回灌调试

文章目录 一、搭建环境二、配置参数三、回灌raw图isp调试中,经常会遇到一些特定场景的效果需要优化,但由于某些原因和成本考虑,开发人员无法亲临现场,这个时候采集场景raw图回灌到板端调试,就显得尤为方便了。 一、搭建环境 (1)建立板端与PQTool连接 板端进入SS928V100…

【基础算法】前缀和

文章目录 算法介绍什么是前缀和&#xff1f;&#xff1f;前缀和的作用一维数组求解前缀和(Si)二维数组求解前缀项和 示例题目1&#xff1a;acwing795示例题目2&#xff1a;acwing796总结收获 算法介绍 什么是前缀和&#xff1f;&#xff1f; 数组: a[1], a[2], a[3], a[4], a[…

Nat Med | Tau靶向反义寡核苷酸

今天给同学们分享一篇实验文章“Tau-targeting antisense oligonucleotide MAPTRx in mild Alzheimers disease: a phase 1b, randomized, placebo-controlled trial”&#xff0c;这篇文章发表在Nat Med期刊上&#xff0c;影响因子为82.9。 结果解读&#xff1a; 患者 从201…

Kubernetes (k8s) 快速认知

应用部署方式 传统部署时代 早期的时候&#xff0c;各个组织是在物理服务器上运行应用程序。缺点 资源分配问题&#xff1a; 无法限制在物理服务器中运行的应用程序资源使用 维护成本问题&#xff1a; 部署多个物理机&#xff0c;维护许多物理服务器的成本很高 虚拟化部署时…

1265. 数星星(树状数组/蓝桥杯)

题目&#xff1a; 输入样例&#xff1a; 5 1 1 5 1 7 1 3 3 5 5输出样例&#xff1a; 1 2 1 1 0 思路&#xff1a; 树状数组 代码&#xff1a; #include<cstdio> #include<iostream> using namespace std; const int N32010; int n; int tr[N],level[N];int lo…

sap table 获取 valuation class MBEW 查表获取

参考 https://www.tcodesearch.com/sap-tables/search?qvaluationclass

【贪心算法】【中位贪心】LeetCode:100123.执行操作使频率分数最大

涉及知识点 双指针 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 贪心算法 题目 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 你可以对数组执行 至多 k 次操作&#xff1a; 从数组中选择一个下标 i &#xff0c;将 nums[i] …

springboot221酒店管理系统

springboot221酒店管理系统 源码获取&#xff1a; https://docs.qq.com/doc/DUXdsVlhIdVlsemdX

sql注入攻击的原理及注入攻击方式

SQL注入攻击是一种常见的网络安全威胁&#xff0c;它利用了Web应用程序中对SQL语句的不当处理。在SQL注入攻击中&#xff0c;攻击者通过将恶意SQL代码嵌入到应用程序预期的输入中&#xff0c;从而能够控制或欺骗后端数据库系统。这种攻击可以用来获取未授权的数据访问&#xff…

飞天使-docker知识点4-harbor

文章目录 Harbor安装完成harbor 官方建议方式之后查看 images配置docker 使用harbor 仓库上传下载镜像docker 镜像结合harbor 运行 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器&#xff0c;由 vmware 开源&#xff0c;其通过添加一些企业必需的功…

55 代码审计-JAVA项目注入上传搜索或插件挖掘

目录 必备知识点演示案例:简易Demo段SQL注入及预编译IDEA审计插件FindBugs安装使用Fortify_SCA代码自动审计神器使用Ofcms后台SQL注入-全局搜索关键字Ofcms后台任意文件上传-功能点测试 涉及资源&#xff1a; 我们一般针对java项目&#xff0c;进行漏洞分析的话&#xff0c;主要…