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

【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.hqwc.cn/news/283008.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】封装:练习案例-设计立方体类

练习案例&#xff1a;设计立方体类 设计立方体类(Cube) 求出立方体的面积和体积 分别用全局函数和成员函数判断两个立方体是否相等。 思路&#xff1a; 1&#xff09;创建立方体类 2&#xff09;设计属性 长&#xff0c;高&#xff0c;宽 3&#xff09;设计行为 获取立方…

在Windows上通过VS2019自带的Cmake来编译OpenCV-4.5.3源码

文章目录 用VS打开OpenCV源码cmake的配置及生成操作生成及安装 用VS打开OpenCV源码 方式一&#xff1a;文件–》打开–》Cmake 找到源码根目录下CMakeLists.txt文件 导入即可。 方式二&#xff1a;在开始使用这里 选择 打开本地文件夹 找到源码的根目录&#xff0c;导入即可…

IDEA中,如何将maven项目变为SpringBoot项目?

第一步&#xff1a;新建Maven工程 这很简单不做过多赘述。 第二步&#xff1a;修改pom.xml文件 分别加入springboot父依赖&#xff0c;web依赖&#xff0c;test测试依赖&#xff0c;maven打包依赖。 <?xml version"1.0" encoding"UTF-8"?> <…

5.5 Linux Apache服务

1、概念介绍 a. Web 服务简介 WEB服务器也称为WWW(WORLD WIDE WEB&#xff0c;万维网)服务器&#xff0c;主要功能是提供网上信息浏览服务。 常用web服务器&#xff1a;httpd&#xff08;apache&#xff09;、nginx、tomcat、IIS 客户端&#xff1a;IE、firefox、chrome b…

PyTorch官网demo解读——第一个神经网络(2)

上一篇&#xff1a;PyTorch官网demo解读——第一个神经网络&#xff08;1&#xff09; 继上一篇文章我们展示了第一个神经网络的完整代码&#xff0c;今天我们来聊聊这个神经网络的模型设计。 这个demo实际上只使用了一个简单的线性模型&#xff1a;y wx b&#xff1b; 手写…

5.2 Linux FTP 服务

1、概念介绍 FTP&#xff08;File Transfer Protocol:文件传输协议&#xff09;作用Internet 上用来传送文件的协议 FTP Server&#xff08;File Transfer Protocol Server&#xff09;是在互联网/局域网上提供文件存储和访问服务的计算机&#xff0c;它们依照FTP协议提供服务…

【MySQL】数据库和表的操作

数据库和表的操作 一、数据库的操作1. 创建数据库2. 字符集和校验规则&#xff08;1&#xff09;查看系统默认字符集以及校验规则&#xff08;2&#xff09;查看数据库支持的字符集&#xff08;3&#xff09;查看数据库支持的字符集校验规则&#xff08;4&#xff09;校验规则对…

《点云处理》平面拟合

前言 在众多点云处理算法中&#xff0c;其中关于平面拟合的算法十分广泛。本篇内容主要是希望总结归纳各类点云平面拟合算法&#xff0c;并且将代码进行梳理保存。 环境&#xff1a; VS2019 PCL1.11.1 1.RANSAC 使用ransac对平面进行拟合是非常常见的用法&#xff0c;PCL…

音频I2S

前言 基于网上资料对相关概念做整理汇总&#xff0c;部分内容引用自文后文章。 学习目标&#xff1a;简单了解相关概念、相关协议。 1 概述 数字音频接口DAI&#xff0c;即Digital Audio Interfaces&#xff0c;顾名思义&#xff0c;DAI表示在板级或板间传输数字音频信…

【STM32】STM32学习笔记-EXTI外部中断(11)

00. 目录 文章目录 00. 目录01. 中断系统02. 中断执行流程03. STM32中断04. NVIC基本结构05. NVIC优先级分组06. EXTI简介07. EXTI基本结构08. AFIO复用IO口09. EXTI框图10. 计数器模块11. 旋转编码器简介12. 附录 01. 中断系统 中断&#xff1a;在主程序运行过程中&#xff0…

设计模式 五种不同的单例模式 懒汉式 饿汉式 枚举单例 容器化单例(Spring单例源码分析) 线程单例

单例模式 第一种 饿汉式 优点&#xff1a;执行效率高&#xff0c;性能高&#xff0c;没有任何的锁 缺点&#xff1a;某些情况下&#xff0c;可能会造成内存浪费 /*** author LionLi*/ public class HungrySingleton {private static final HungrySingleton hungrySingleton n…

【JavaWeb学习笔记】11 - WEB工程路径专题

一、工程路径问题 1.引入该问题 通过这几个去访问很麻烦 二、工程路径解决方案 1.相对路径 1.说明:使用相对路径来解决&#xff0c;一 个非常重要的规则:页面所有的相对路径&#xff0c;在默认情况下&#xff0c;都会参考当前浏览器地址栏的路径http:/ /ip:port/工程名/来进…