summary17 xml

本文详细介绍了XML(扩展性标识语言)的基本概念、作用、语法规范及应用。涵盖了文档声明、元素、属性、注释、CDATA节、处理指令等内容,并提供了C++访问XML文件的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 定义:XML,Extensible Markup Language,扩展性标识语言。文件的后缀名为:.xml。就像HTML的作用是显示数据,XML的作用是传输和存储数据。

2. 作用:为了便于不同应用、不同平台之间的数据共享和通信。(传输和存储数据,HTML是显示数据)

具体点的作用为:

(1)可作为一种简单的数据库,存储并检索数据;

(2)传输约定格式的文件;

(3)做软件的配置文件。【配置文件:保存软件设置的文件】

https://blog.youkuaiyun.com/qsbbl/article/details/78628472

3.语法:

1)XML语法-文档声明

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
  • XML声明放在XML文档的第一行 

XML声明由以下几个部分组成:

version –文档符合XML1.0规范,我们学习1.0 
encoding –文档字符编码,比如”GB2312”或者”UTF-8” 
standalone –文档定义是否独立使用 
standalone=”no”为默认值。yes代表是独立使用,而no代表不是独立使用

 

2)XML语法-元素(或者叫标记、节点)

(1)每个XML文档必须有且只有一个根元素

  • 根元素是一个完全包括文档中其他所有元素的元素
  • 根元素的起始标记要放在所有其他元素的起始标记之前
  • 跟元素的结束标记要放在所有其他元素的结束标记之后

(2)XML元素指的是XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写方式,例如

  • 包含标签体:
<a>www.sohu.com</a>
  • 不含标签体的:
<a></a>,简写为:<a/>
  • (3)一个标签中也可以嵌套若干子标签。但所有标签必须合理地嵌套,绝对不允许交叉嵌套,例如
<a>welcome to <b> www.sohu.com </a></b>
  • 这种情况肯定是要报错的。

(4)对于XML标签中出现的所有空格和换行,XML解析程序都会当做标签内容进行处理。例如下面两段内容的意义是不一样的。

<stu>xiaoming</stu>
  • 和如下:
 
  1. <stu>

  2. xiaoming

  3. </stu>

(5)由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,要特别注意。

(6)命名规范:一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守以下规范:

  • 区分大小写,例如,元素P和元素p是两个不同的元素
  • 不能以数字或下划线”_”开头
  • 元素内不能包含空格
  • 名称中间不能包含冒号(:)
  • 可以使用中文,但一般不这么用

3)XML语法-属性

 
  1. <student id="100">

  2. <name>Tom</name>

  3. </student>

(1)属性值用双引号(”)或单引号(’)分隔,如果属性值中有单引号,则用双引号分隔;如果有双引号,则用单引号分隔。那么如果属性值中既有单引号还有双引号怎么办?这种要使用实体(转义字符,类似于html中的空格符),XML有5个预定义的实体字符,如下:

XML实体字符

(2)一个元素可以有多个属性,它的基本格式为:

<元素名 属性名1="属性值1" 属性名2="属性值2">
  • (3)特定的属性名称在同一个元素标记中只能出现一次 

(4)属性值不能包括<,>,&,如果一定要包含,也要使用实体

 4)XML语法-注释

XML的注释类似于HTML中的注释:

<!--这是一个注释-->
  • (1)注释内容不要出现-- 

(2)不要把注释放在标记中间; 
(3)注释不能嵌套 
(4)可以在除标记以外的任何地方放注释

 5)XML语法-CDATA节

假如有这么一个需求,需要通过XML文件传递一幅图片,怎么做呢?其实我们看到的电脑上的所有文件,本质上都是字符串,不过它们都是特殊的二进制字符串。我们可以通过XML文件将一幅图片的二进制字符串传递过去,然后再解析成一幅图片。那么这个字符串就会包含大量的<,>,&或者“等一些特殊的不合法的字符。这时候解析引擎是会报错的。

所以,有些内容可能不想让解析引擎解析执行,而是当做原始内容处理,用于把整段文本解释为纯字符数据而不是标记。这就要用到CDATA节。

语法如下:

 
  1. <![CDATA[

  2. ......

  3. ]]>

CDATA节中可以输入任意字符(除]]>外),但是不能嵌套!

如下例,这种情况它不会报错,而如果不包含在CDATA节中,就会报错:

 
  1. <stu id="001">

  2. <name>杨过</name>

  3. <sex>男</sex>

  4. <age>20</age>

  5. <intro><![CDATA[ad<<&$^#*k]]></intro>

  6. </stu>

6)XML语法-处理指令

处理指令,简称PI(processing instruction)。处理指令用来指示解析引擎如何解析XML文件,看下面一个例子:

比如我们也可以使用css样式表来修饰XML文件,编写my.css如下:

 
  1. name{

  2. font-size:80px;

  3. font-weight:bold;

  4. color:red;

  5. }

  6.  
  7. sex{

  8. font-size:60px;

  9. font-weight:bold;

  10. color:blue;

  11. }

  12.  
  13. sex{

  14. font-size:40px;

  15. font-weight:bold;

  16. color:green;

  17. }

 

我们在xml文件中使用处理指令引入这个css文件,如下:

 
  1. <?xml version="1.0" encoding="gb2312"?>

  2. <?xml-stylesheet href="my.css" type="text/css"?>

  3. <class>

  4. <stu id="001">

  5. <name>杨过</name>

  6. <sex>男</sex>

  7. <age>20</age>

  8. </stu>

  9. <stu id="002">

  10. <name>小龙女</name>

  11. <sex>女</sex>

  12. <age>21</age>

  13. </stu>

  14. </class>

 

这时候我们再用浏览器打开这个xml文件,会发现浏览器解析出一个带样式的视图,而不再是单纯的目录树了:

XML修改样式

但是XML的处理指令不要求掌握,因为用到的很少。

7)格式正规的XML文档-小结

语法规范

1.XML声明语句 
2.必须有一个根元素 
3.标记大小写敏感 
4.属性值用引号 
5.标记成对 
6.空标记关闭 
7.元素正确嵌套

https://blog.youkuaiyun.com/aidem_brown/article/details/82217481

C++访问xml文件:

1)TiXmlDocument doc; //文档类型变量

2)TiXmlElement *root = doc.FirstChildElement(); //指向xml根元素

3)TiXmlElement *elem = root->FirstChildElement(); //指向根的第一个孩子

4)TiXmlNode* node = elem1->FirstChild();//node指向elem1元素下的文本

xml:

<ToDo>
    <Item priority="1"> 
        <bold>
            Book store!
        </bold>
    </Item>
    <Item priority="2"> 
        book1
    </Item>
    <Item priority="2"> 
        book2
    </Item>
</ToDo>

C++:

#include "tinyxml.h"
#include <iostream>
#include <string>
using namespace std;
void loadXML() {
	TiXmlDocument doc;//申明一个文档类型变量,用来存储读取的xml文档
	if (!doc.LoadFile("a.xml"))	//检测xml文档是否存在
	{
		cerr << /*doc.ErrorDesc()*/"no file" << endl;
		return;
	}
	TiXmlElement* root = doc.FirstChildElement();//指向xml文档的根元素
	if (root == NULL)//检测根元素存在性		
	{
		cerr << "Failed to load file: No root element." << endl;
		doc.Clear();
	}
	//elem指向根的第一个孩子元素
	for (TiXmlElement* elem = root->FirstChildElement(); elem != NULL; elem = elem->NextSiblingElement())
	{
		const char* arr = elem->Attribute("priority"); //通过元素属性寻找元素
		if (strcmp(arr, "1") == 0)
		{
			TiXmlElement* elem1 = elem->FirstChildElement();
			TiXmlNode* node = elem1->FirstChild();//node指向elem1元素下的文本
			cout << node->Value() << endl;
		}
		if (strcmp(elem->Value(), "Item1") == 0) //也可以通过元素名寻找元素 
		{
			TiXmlNode* node = elem->FirstChild();
			cout << node->Value() << endl;
		}
	}
}
int main(int argc, char* argv[])
{
	loadXML();
	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值