XML基础介绍【一】
XML基础介绍【一】
1、XML简介(Extensible Markup Language)[可扩展标记语言]
XML全称为Extensible Markup Language, 意思是可扩展的标记语言,它是 SGML(标准通用标记语言)的一个子集。
标记语言:HTML
可扩展标记语言
- HTML里面标签是固定的,每个标签都有特定的含义
- 标签可以自己定义,可以写中文标签<person></person>,<人></人>
XML用途
- html是用于显示数据,xml也可以显示数据(并非主要功能)
- xml主要功能:为了存储数据
W3C在1998年2月发布1.0版本;
W3C在2004年2月发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。我们要学习的还是1.0版本。
xml版本:1.0 1.1
- 目前使用的都是1.0版本(1.1版本不能向下兼容)
2、XML的应用
a. 程序的配置文件(这也是最后大家使用XML最常见的目的);
b. 数据交换:不同语言之间用来交换数据;
c. 小型数据库:用来当数据库存储数据。
- 不同的系统之间传输数据
QQ之间数据的传输 图解【xml应用1】
- 用来表示生活中有关系的数据
图解【xml应用2】
- 经常用在配置文件
比如数据库连接[用户 密码 数据库名称],修改数据库的信息,不需要修改源代码,只修改配置文件即可
3、XML语法
(1)xml的文档声明
创建一个文件 后缀名:.xml
一个xml文件第一步必须要有一个文档声明用来表示xml文件的内容
文档声明必须第一行 <?xml version="1.0" encoding="utf-8"?>
属性:
- version:xml的版本 1.0 1.1
- encoding:xml的编码 [GBK UTF-8 ISO8859-1(不包含中文)]
- standalone:是否需要依赖其他文件 yes/no
xml中文乱码问题
- 图解
- 保存文件时编码和设置打开的时候的编码一致 => 乱码问题解决
(2)定义元素(标签) (3)定义属性 (4)注释 (5)特殊字符 (6)CDATA区 (7)PI指令
4、XML元素的定义
标签必须成对出现<person><person/>
标签没有内容可在标签内结束:空元素<student/>
标签必须合理的嵌套
- 合理嵌套<aa><bb></bb></aa>
- 不合理嵌套<aa><bb></aa></bb>
一个xml中只能有一个根标签,其他标签都是这个标签下面的标签
在xml中空格和换行都当成内容来解析
两段代码的不一样
- <aa>student</aa>
- <aa>
student
</aa>
xml标签可以使中文
xml标签中的命名规则
(1)xml代码区分小大写
<a> <A>:不一样的含义
(2)xml的标签不能以数字和下划线开头
<2a> <_aa>
(3)xml标签不能以xml、XML、Xml等开头
<xmla> <XmlB> <XMLC>
(4)xml的标签不能包含空格和冒号
<a b> <a:c>
5、XML中属性的定义
html是标记型文档,可以有属性
xml是标记型文档,也可以有属性
- <person id="name">student</person>
属性的定义要求
(1)一个标签上可有多个属性
- <person id1="name" id2="bbb">student</person>
(2)属性名称不能相同
- <person id1="name" id1="bbb">student</person>
(3)属性名称和属性值之间使用 = ,属性值使用引号(单引号 or 双引号)
(4)xml属性的名称规范和元素的名称规格一致
6、XML的注释
<!-- xml注释 --> (不能嵌套注释,不能放在第一行,第一行必须放xml文档的声明)
7、XML中的特殊字符
需要进行转义【图解】
8、CDATA区
可以解决多个字符都需要转义的操作,放在CDATA区内就不需要转义
格式:
<![CDATA[ 内容 ]]>
code:<![CDATA[ if>&& and < $%*{} ]]>
把特殊字符当做文本内容,而不是标签
e-code
e-image
9、PI指令(处理指令)
可在xml中设置样式(只能对英文标签起作用,对于中文的标签名称不起作用)
<?xml-stylesheet type="text/css" href="css的路径"?>
e-code
css
e-image
10、xml的约束简介(DTD)
为什么要约束?
- 比如定义一个person的xml文件,这个文件只保存人的信息。但在文件中定义了其他标签<猫>,也符合xml的语法规范。但是猫不属于人类信息,这是就需要约束xml。
e-image
xml约束技术:DTD约束、schema约束
11、DTD快速入门
创建一个文件 后缀名: .dtd
步骤:
(1)看xml中有多少个元素,有几个就在dtd中定义一个<!ELEMENT>
(2)判断元素是简单元素还是复杂元素
- 复杂元素:有子元素的元素
<!ELEMENT 元素名称 (子元素1,子元素2,....)>
- 简单元素:没有子元素
<!ELEMENT 元素名称 (#PCDATA)>
(3)在xml文件中引入外部dtd文件
- <!DOCTYPE 根元素名称 SYSTEM "dtd文件路径">
打开xml文件使用浏览器打开,浏览器只负责校验xml的语法,不负责检验约束。这时可使用工具进行约束(MyEclipse)
MyEclipse校验xmldtd约束【图解】
e-image
12、dtd三种引入方式
(1)外部引入dtd:<!DOCTYPE 根元素名称 SYSTEM "dtd文件路径">【区分小大写且有空格】
e-image
(2)内部dtd
<!DOCTYPE 根元素名称 [
<!ELEMENT 元素名称 (子元素1,子元素2,....)>
<!ELEMENT 元素名称 (#PCDATA)>
<!ELEMENT 元素名称 (#PCDATA)>
]>
(3)使用外部的dtd(网络上的dtd文件)
- <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
- 框架struts2 使用配置文件,使用外部dtd
- <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
13、使用DTD定义元素
语法: <!ELEMENT 元素名 约束>
简单元素:没有子元素的元素
<!ELEMENT name (#PCDATA)>
(#PCDATA): 约束name是字符串类型
EMPTY : 元素为空(没有内容)
- <sex></sex>
ANY:任意
复杂元素:
<!ELEMENT person (name,age,sex,school)>
- 子元素只能出现一次
<!ELEMENT 元素名称 (子元素)>
表示子元素出现的次数
+ : 表示一次或者多次
? :表示零次或者一次
* :表示零次或者多次
子元素直接使用逗号进行隔开 ,
表示元素出现的顺序
子元素直接使用|隔开
表示元素只能出现其中的任意一个
e-image
14、使用DTD定义属性
语法: <!ATTLIST 元素名称
属性名称 属性类型 属性的约束
>
属性类型
- CDATA: 字符串
- 枚举 : 表示只能在一定的范围内出现值,但是只能每次出现其中的一个
- ID:值只能是字母或者下划线开头
属性的约束
- #REQUIRED:属性必须存在
- #IMPLIED:属性可有可无
- #FIXED: 表示一个固定值
- 属性的值必须是设置的这个固定值
- 直接值
不写属性,使用直接值
写了属性,使用设置那个值
e-code
<?xml version="1.0" encoding="UTF-8"?>
<!-- 内部dtd -->
<!DOCTYPE person [
<!ELEMENT person (id,name+,age?,sex*,school,birthday)>
<!ELEMENT id (#PCDATA)>
<!-- 固定值 -->
<!ATTLIST id
ID1 CDATA #FIXED "xh"
> <!ELEMENT name (#PCDATA)>
<!-- 字符串 -->
<!ATTLIST name
ID2 CDATA #REQUIRED
>
<!ELEMENT age (#PCDATA)>
<!-- 可有可无 -->
<!ATTLIST age
ID3 CDATA #IMPLIED
> <!ELEMENT sex (#PCDATA)>
<!-- 枚举 -->
<!ATTLIST sex
ID4 (men|women) #REQUIRED
> <!ELEMENT school (#PCDATA)>
<!-- 直接值 -->
<!ATTLIST school
ID5 CDATA "ahzsu"
> <!ELEMENT birthday (#PCDATA)>
<!-- ID -->
<!ATTLIST birthday
ID6 ID #REQUIRED
> ]>
<person>
<id ID1="xh">2015112401</id>
<name ID2="user">zhangsan1</name>
<age>18</age>
<sex ID4="men">男</sex>
<school ID5="anhui">ahszu.edu.cn</school>
<birthday ID6="birth">2018</birthday>
</person>
e-image
15、实体的定义
语法: <!ENTITY 实体名称 "实体的值">
<!ENTITY TEST "404boom">
使用实体 &实体名称; 比如 &TEST;
注意: 定义实体需要写在内部dtd里面,如果写在外部的dtd里面,有某些浏览器下,内容得不到
e-image
16、xml的解析的简介(写到java代码)
xml是标记型文档
js使用dom解析标记型文档?
- 根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象
- document对象、element对象、属性对象、文本对象、Node节点对象
xml的解析方式(技术):dom 和 sax
画解分析使用dom解析xml过程
dom解析和sax解析区别:
dom方式解析 :根据xml的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象
缺点:如果文件过大,造成内存溢出
优点:很方便实现增删改操作
sax方式解析:采用事件驱动,边读边解析
- 从上到下,一行一行的解析,解析到某一个对象,返回对象名称
缺点:不能实现增删改操作
优点:如果文件过大,不会造成内存溢出,方便实现查询操作
解析xml,首先需要解析器
不同的公司和组织提供了 针对dom和sax方式的解析器,通过api方式提供
sun公司提供了针对dom和sax解析器 jaxp
dom4j组织,针对dom和sax解析器 dom4j(重点,也是实际开发中使用最多,功能最强)
jdom组织,针对dom和sax解析器 jdom
17、jaxp的api的查看
jaxp是Javase的一部分
jaxp解析器在JDK的javax.xml.parsers包里
四个类:分别针对dom和sax解析使用的类
一、dom
DocumentBuilder:解析器类
这个类是一个抽象类,不能new,此类的实例可以从 DocumentBuilderFactory.newDocumentBuilder() 方法获取。
一个方法,可以解析xml parse("xml路径") 返回是 Document 整个文档。
返回的document是一个接口,父节点是Node,如果在document里面找不到想要的方法,到Node里面去找
- 在document里面方法
getElementsByTagName(String tagname)
-- 这个方法可以得到标签
-- 返回集合 NodeList
createElement(String tagName)
-- 创建标签
createTextNode(String data)
-- 创建文本
appendChild(Node newChild)
-- 把文本添加到标签下面
removeChild(Node oldChild)
-- 删除节点
getParentNode()
-- 获取父节点
NodeList list
- getLength() 得到集合的长度
- item(int index)下标取到具体的值
for(int i=0;i<list.getLength();i++) {
list.item(i);
}
getTextContent()
- 得到标签里面的内容
DocumentBuilderFactory:解析工厂
- 这个类也是一个抽象类,不能new
newInstance() 获取 DocumentBuilderFactory 的实例。
二、sax
SAXParser:解析器类
SAXParserFactory:解析器工厂
18、使用jaxp实现查询操作
查询xml中第一个name元素的值
步骤:
1、创建解析器工厂
2、根据解析器工厂创建解析器
3、解析xml,返回document
4、得到所有name元素
5、返回集合,遍历集合,得到每一个name元素
- 遍历 getLength() item()
- 得到元素里面的值 使用getTextContent方法
查询xml中第一个name元素的值
步骤:
1、创建解析器工厂
2、根据解析器工厂创建解析器
3、解析xml,返回document
4、得到所有name元素
5、使用返回集合,里面方法 item,下标获取具体的元素
NodeList.item(下标): 集合下标从0开始
6、得到具体的值,使用 getTextContent方法
查询xml中第一个name元素的值
步骤:
1、创建解析器工厂
2、根据解析器工厂创建解析器
3、解析xml,返回document
4、得到所有name元素
5、使用返回集合,里面方法 item,下标获取具体的元素
NodeList.item(下标): 集合下标从0开始
6、得到具体的值,使用 getTextContent方法
19、使用jaxp添加节点
在第一个p1下面(末尾)添加 <sex>nv</sex>
步骤:
1、创建解析器工厂
2、根据解析器工厂创建解析器
3、解析xml,返回document
4、得到第一个p1
- 得到所有p1,使用item方法下标得到
5、创建sex标签 createElement
6、创建文本 createTextNode
7、把文本添加到sex下面 appendChild
8、把sex添加到第一个p1下面 appendChild
9、回写xml
20、使用jaxp修改节点
修改第一个p1下面的sex内容是nan
步骤:
1、创建解析器工厂
2、根据解析器工厂创建解析器
3、解析xml,返回document
4、得到sex item方法
5、修改sex里面的值
setTextContent方法
6、回写xml
21、使用jaxp删除节点
删除<sex>nan</sex>节点
步骤:
1、创建解析器工厂
2、根据解析器工厂创建解析器
3、解析xml,返回document
4、获取sex元素
5、获取sex的父节点 使用getParentNode方法
6、删除使用父节点删除 removeChild方法
7、回写xml
22、使用jaxp遍历节点
把xml中的所有元素名称打印出来
步骤:
1、创建解析器工厂
2、根据解析器工厂创建解析器
3、解析xml,返回document
* ====使用递归实现=====
4、得到根节点
5、得到根节点子节点
6、得到根节点子节点的子节点
e-code(18-22)
package boom.jaxp; import java.io.IOException; import javax.xml.crypto.dsig.Transform;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException; public class TestJaxp { /**
* 实现jaxp操作xml
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// selectAll();
// selectSingle();
// addSex();
// modifySex();
// delSex();
listElement(); } // 1、查询person.xml中第一个name元素值
public static void selectSingle() throws Exception{
Document document = tempmodel(); // 得到所有的name元素
NodeList list = document.getElementsByTagName("name");
// 使用返回的集合里面的item方法,下标获取具体元素
Node name2 = list.item(0);
// 得到具体的值,使用getTextContent()
String s1 = name2.getTextContent();
System.out.println("s1="+s1); } // 1.1、查询所有的name元素的
public static void selectAll() throws Exception {
Document document = tempmodel(); // 得到name元素
NodeList list = document.getElementsByTagName("name");
// 遍历
for (int i = 0;i<list.getLength();i++) {
Node name1 = list.item(i); // 得到每一个元素的值
// 得到标签里面元素的值
String s = name1.getTextContent();
System.out.println("s="+s);
}
} // 2、在第一个p下面(末尾)添加 <sex>nv</sex>
public static void addSex() throws Exception{
Document document = tempmodel(); // 得到所有的p标签
NodeList list = document.getElementsByTagName("p");
// 得到第一个p标签
Node p = list.item(0);
// 创建标签
Element sex = document.createElement("sex");
// 创建文本
Text text = document.createTextNode("男");
// 把文本添加到sex1下面
sex.appendChild(text);
// 把sex1添加到p1下面
p.appendChild(sex);
// 回写xml文件
rexml(document);
} // 3、修改第一个p下面的sex为nv
public static void modifySex() throws Exception{
Document document = tempmodel(); // 得到sex
Node sex = document.getElementsByTagName("sex").item(0);
// 修改sex内的内容
sex.setTextContent("nv");
// 回写xml文件
rexml(document);
} // 4、使用jaxp删除节点(删除<sex>nan</sex>节点)
public static void delSex() throws Exception{
Document document = tempmodel();
// 得到sex元素
Node sex = document.getElementsByTagName("sex").item(0);
// 得到sex父节点
Node p = sex.getParentNode();
// 删除
p.removeChild(sex); // 回写xml文件
rexml(document); } // 5、遍历节点,把所有的名称的打印出来
public static void listElement() throws Exception{
Document document = tempmodel();
// 编写一个方法用于遍历操作
list(document); } /**
* 递归遍历的方法
* @param node
*/
public static void list(Node node) {
//判断是元素类型时候才打印
if(node.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
// 得到一层子节点
NodeList list = node.getChildNodes();
for(int i=0;i<list.getLength();i++){
// 得到每一个节点
Node node1 = list.item(i);
//继续得到node1的子节点
//node1.getChildNodes();
list(node1); } }
/**
* 被封装的tempmodel()、Retempmodel();
* @return
* @throws Exception
*/
// 头文件的tempmodel();
public static Document tempmodel() throws Exception {
// 创建解析器厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
// 根据解析器工厂创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 解析xml,返回document
Document document= builder.parse("src/person.xml");
return document;
}
// Retempmodel 的xml文件();
public static void rexml(Document document) throws Exception {
// 回写xml文件
TransformerFactory tanTransformerFactory = TransformerFactory.newInstance();
Transformer transformer = tanTransformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
} }
xml文件截图:
XML基础介绍【一】的更多相关文章
- XML基础介绍【二】
XML基础介绍[二] 1.schema约束dtd语法: <!ELEMENT 元素名称 约束>schema符合xml的语法,xml语句.一个xml中可以有多个schema,多个schema使 ...
- XML 参考:XML基础 XML 简介
XML 参考:XML基础 -- XML简介和用途 转:http://www.cnblogs.com/Dlonghow/archive/2009/01/22/1379799.html XML 参考:XM ...
- laravel基础课程---1、laravel安装及基础介绍(laravel如何安装)
laravel基础课程---1.laravel安装及基础介绍(laravel如何安装) 一.总结 一句话总结: [修改composer镜像地址].[明确laravel的安装要求].[安装指定版本的la ...
- xml基础之二(XML结构【2】)DTD文档模版
xml基础之二(XML结构[2])DTD文档模版 xml 模板 文档结构 我们知道XML主要用于数据的存储和传输,所以无论是自定义还是外部引用DTD模板文档,都是为了突出数据的存储规范.DTD(文档 ...
- iOS 阶段学习第23天笔记(XML数据格式介绍)
iOS学习(OC语言)知识点整理 一.XML数据格式介绍 1)概念:xml是extensible markup language扩展的标记语言,一般用来表示.传输和存储数据 2)xml与json目前使 ...
- .net学习笔记---xml基础知识
一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...
- Web3D编程入门总结——WebGL与Three.js基础介绍
/*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...
- web.xml 详细介绍(转)
web.xml 详细介绍 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧 ...
- C++ 迭代器 基础介绍
C++ 迭代器 基础介绍 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围.迭代器就如同一个指针.事实上,C++的指针也是一种迭代器.但是,迭代器不仅仅是指针,因此你不能认为他们一定 ...
随机推荐
- 监控数据库DDL操作日志
背景 为了监控好生产环境下各个数据库服务器上DDL操作日志,便于运维工程师管控好风险,我们有必要关注当前实例下的所有的DDL操作以及对应的IP和hostname. 测试环境 Microsoft SQL ...
- Nginx+FastCGI到底是谁影响超时时间
需求: 一个php程序要跑一段时间,但是时间不确定. 问题: 当该php程序运行超过一段时间被强制断开连接. PHP本身超时处理 在 php.ini 中,有一个参数 max_execution_tim ...
- Java内部类(1):概述
> 将一个类的定义放在另一个类的定义内部,这就是内部类. > 使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内 ...
- 【JVM学习笔记】ServiceLoader类
ServiceLoader.load方法的函数原型如下 public static <S> ServiceLoader<S> load(Class<S> servi ...
- java 与 c# 3des 加解密
java 与 c# 3des 加解密 主要差异如下: 1. 对于待加密解密的数据,各自的填充模式不一样 C#的模式有:ANSIX923.ISO10126.None.PKCS7.Zero,而Jav ...
- ASP.NET Core 入门笔记8,ASP.NET Core MVC 分部视图入门
一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)分部视图简介 ASP.NET Core MVC (Razor)分部视图基础教程 ASP.NET Core MVC (Raz ...
- dfs入门-cogs1640[黑白图像]
题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=vxSmxkeqa [题目描述] 输入一个n×n的黑白图像(1表示黑色,0表示白色),任务 ...
- hydra 使用
Hydra介绍 Hydra是一个并行登录破解器,支持多种攻击协议.它非常快速和灵活,新模块易于添加.该工具使研究人员和安全顾问能够展示远程获得对系统未经授权的访问是多么容易. 它支持:Cisco AA ...
- AspxGridView 弹框选择器 JS
function Dictionary() { this.data = new Array(); this.put = function (key, value) { this.data[key] = ...
- css 移动端1px更细
1.最近写项目经常遇到4个入口菜单放在一行,然后加border:1px 在移动端显示却很粗,如下图: <div class="header"> <div clas ...