JAVA企业级开发-xml基础语法&约束&解析(04)
一、什么是xml
html:超文本标记语言。它主要是用来封装页面上要显示的数据,最后通过浏览器来解析html文件,然后把数据展示在浏览器上。同样我们可以使用JS和DOM技术对html文件进行解析和操作。
xml:可扩展的标记语言。它早期是为了代替html技术,但是由于html书写的网页在全球占有率太高,最后没有成功。
后期我们开始使用xml文件作为软件的配置文件,或者数据的存储文件,以及传输数据的文件。
二、xml的作用
xml文件主要是用来存储数据和传输数据。
在安卓、IOS等客户端系统和服务器交互过程中,一般会使用xml文件作为数据的传输。
描述省市关系:
<中国>
<省 name=”江苏省” id=”001”>
<市 name=”南京市”>
<区>yyy</区>
</市>
</省>
<省 name=”安徽省” id=”002”>
<市 name=”合肥市”>
<区>xxx</区>
</市>
</省>
</中国>
配置文件存在:
360等客户端程序中就使用xml文件作为配置文件。
三、xml语法
一个XML文件分为如下几部分内容:
文档声明 (重点)
元素(重点)
属性(重点)
注释
CDATA区 、特殊字符
处理指令(processing instruction)
1、文档声明
在定义xml文件的时候,通过声明告诉其他的解析软件,当前的这个文档是一个xml文档。
格式:
<?xml key=value key=value ?>
<?xml key=value key=value ?>
声明中的key和value是固定的:
version=1.0
<?xml version=”1.0” ?>
encoding=编码表
<?xml version=”1.0” encoding=”UTF-8” ?>
standalone="yes"
经常书写的xml的声明:
<?xml version=”1.0” encoding=”UTF-8” ?>
xml文件使用的是普通的记事本保存:
1、xml文件保存是采用GBK编码保存。
2、浏览器加载时会根据文档声明进行解码
3、如果文档声明的编码是UTF-8,那么就会中文乱码异常。
上述的关于声明中的乱码问题,在使用eclipse或MyEclipse无法测试的。
书写xml声明时的错误:
<?xml version="1.0" encoding="utf-8" ?>
在 < ? xml 之间不要有其他的字符 ?>也不要有其他的字符
2.、元素(标签)
xml中的标签 也 分成 单标签和双标签:
单标签: < 标签名 属性=值 属性=值 ...... />
双标签:< 标签名 属性=值 属性=值 ......>文本数据或子标签</标签名>
标签的书写注意事项:
1、xml中的所有标签必须闭合。
2、xml中的标签名称严格区分大小写。<User> <user>
3、在xml标签中间不要书写空格,或者 冒号 逗号 等符号。
4、标签名不要以数字开始。
书写xml标签时 ,标签不能互相嵌套。
<age>23<name>zhangsan></age></name>
在xml中标签的属性可以写成标签的子标签。
<user password=”abc”/>
<user><password>abc</password></user>
在使用程序解析xml中的标签 属性 和文本的时候, 标签中的回车换行都会解析成当前标签的子标签。
所有的xml文件只能有一个根标签。
3.、xml属性
在标签上可以书写属性:
一个标签上可以书写多个属性。每个属性的值可以使用 单引号 或 双引号引用。
的规则和标签的书写规则一致。
4、xml注释:
xml中的注释和html的注释书写一致:
格式:
<!-- 注释内容 -->
如果使用浏览器解析xml文件,那么xml文件中的注释会显示在浏览器中。
5、文本区域(CDATA区)
当我们希望把一本文本原样显示在浏览器中时。
可以使用xml中提供的CDATA区。
格式:
<![CDATA[需要原样显示的数据]]>
需求:
1、在xml文件中原样显示
<h1>在html表示的是标题标签
<br>在html表示换行
注意:书写时 一定要在根标签内。
由于CDATA 区域书写比较麻烦,可以使用特殊字符:
<
$gt;
用转义字符完成需求1;
6.、处理指令
处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。
例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。 <?xml-stylesheet type="text/css" href="1.css"?>
处理指令必须以“<?”作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。
xml文件
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="1.css"?> //处理指令 引用1.css
<books>
<book>
我去
</book>
<author>
HELLO
</author>
</books>
1.css
book { color:red; }
四、xml的约束
由于xml语法中规定标签可以由开发者自己定义。导致解析时无法使用同一的代码来解析。
W3C组织它们早期指定的xml的约束技术为DTD技术,后期升级为Schema约束。
1.DTD约束:
DTD的快速入门:
a、先创建一个xml文件:
b、书写一个DTD文件
dtd文件的扩展名 必须是dtd
在xml中有多少个不同的标签,在dtd中就书写多少个ELEMNT
c、在xml文件中导入DTD的约束
格式:
DTD和xml文件的结合方式:
使用内部DTD
可以把dtd和xml书写在同一个文件中:
<!DOCTYPE 根标签名 [
写dtd的约束
] >
使用外部DTD
可以把DTD文件和xml文件分别书写在2个文件中,然后在xml文件中使用:
<!DOCTYPE 根标签名 SYSTEM “dtd文件的路径” >
使用公共DTD
可以引入互联网中存在一个DTD约束。
<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
4.3、DTD的元素(ELEMENT)定义
<!DOCTYPE 根元素 SYSTEM "文件名">
DTD的学习目的:
可以看懂DTD文件,基于这个DTD文件可以写一个符合约束的xml文件即可。
2.、DTD的语法介绍
在DTD中使用 ELEMENT 声明当前xml中可以出现的标签名称, () 限制当前这个标签中的文本或者子标签。
告诉我们 当前的xml中可以有一个 books 标签,在这个books标签下可以有一个或多个book子标签。
+ 当前括号中的这个标签可以出现一次或多次
? 当前括号中的这个标签可以出现零次或一次
* 当前括号中的这个标签可以出现零次或多次
括号中的逗号,是在定义出现的子标签的顺序。
当前这个name标签中可以书写文本
4、属性(ATTLIST)定义
<!ATTLIST 标签名
属性名 属性类型 属性约束
属性名 属性类型 属性约束
...
>
5、实体(ENTITY)定义
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books [
<!ELEMENT books (book+)>
<!ELEMENT book (name,auth,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)> <!ENTITY writer "Bill Gates">
]>
<books>
<book>
<name>九阴真经</name>
<auth>&writer;</auth>
<price>9.9</price>
</book>
<book>
<name>九阳神功</name>
<auth></auth>
<price>9.8</price>
</book>
</books>
五、Schema约束
Schema它也是用来约束xml文件的。
DTD的缺点:
1、DTD约束xml的时候,不能对xml中的数据类型做详细的限定。
2、DTD约束有自己的语法,书写时必须遵守DTD的语法。
3、一个xml文件中只能引入一个DTD约束,而无法通过多个DTD文件来约束同一个xml文件。
Schema约束:
对DTD那些缺点进行补充。Schema文件它本身就是一个xml文件。书写的时候,它遵守xml的语法规则。
在书写Schema的时候,就和书写xml文件一样。
书写Schema文件的时候,它的文件扩展名xsd。
1、Schema快速入门
a、定义一个xml文件
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book aaa="one" bbb="zhangsan" ccc="c001" ddd="d001">
<name>九阴真经</name>
<auth>班长</auth>
<price>9.9</price>
</book>
<book aaa="one" bbb="zhangsan" ccc="c001" ddd="d001">
<name>九阳神功</name>
<auth>班导</auth>
<price>9.8</price>
</book>
</books>
b、书写一个Schema文件
1、在Schema文件中 必须以 schema作为 Schema文件的根标签。
它的含义是表示当前的Schema文件是被当前指定的url(名称空间)所约束。
给当前这个Schema文件起名字,当需要被当前这个Schema文件约束的xml文件,需要通过当前这个名字引入当前Schema文件。
targetNamespace属性对应的属性值,可以是任意的内容。
在Schema文件中书写当前xml中可以出现的标签 以及子标签 等信息
1、先清楚xml中需要多少个不同标签,在Schema文件中就书写多少个element标签
2、element标签中的 name属性 就是xml中 可以书写的标签的名字
3、在Schema中它把xml中可以出现的标签分成简单标签和复杂标签
简单标签:只有文本数据的标签,成为简单标签
复杂标签:如果标签上有属性,或者有子标签,或者有属性和子标签 或 属性和文本的标签复杂标签
4、针对复杂标签,需要在当前的标签中书写子标签来限制当前复杂标签中的其他内容
在element标签中需要使用complexType 声明当前的element标签name属性指定的是一个复杂标签
如果是简单标签可以使用simpleType
5、对于复杂标签 需要 在 complexType中书写 sequence 标签 表示子标签的顺序
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.huyouta.com/books"
elementFormDefault="qualified"> <!--
在Schema文件中书写当前xml中可以出现的标签 以及子标签 等信息
1、先清楚xml中需要多少个标签,在Schema文件中就书写多少个element标签
2、element标签中的 name属性 就是xml中 可以书写的标签的名字
3、在Schema中它把xml中可以出现的标签分成简单标签和复杂标签
简单标签:只有文本数据的标签,成为简单标签
复杂标签:如果标签上有属性,或者有子标签,或者有属性和子标签 或 属性和文本的标签复杂标签
4、针对复杂标签,需要在当前的标签中书写子标签来限制当前复杂标签中的其他内容
在element标签中需要使用complexType 声明当前的element标签name属性指定的是一个复杂标签
如果是简单标签可以使用simpleType
5、对于复杂标签 需要 在 complexType中书写 sequence 标签 表示子标签的顺序 -->
<element name="books"> <!-- books 是一个复杂标签 -->
<complexType>
<sequence> <!-- 定义当前books 标签中的子标签的顺序 -->
<element name="book">
<complexType> <!-- 声明当前的book 又是一个复杂标签 -->
<sequence>
<!-- 在element 标签中的 type属性来限制当前单标签中文本的类型 -->
<element name="name" type="string"></element>
<element name="author" type="string"></element>
<element name="price" type="double"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
3、在xml文件中引入Schema文件
xmlns="http://www.huyouta.com/books"
在xml中引入 Schema文件的名称
<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://www.huyouta.com/books"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.huyouta.com/books books.xsd"
>
<book>
<name>葵花宝典</name>
<author>班长</author>
<price>9.9</price>
</book>
</books>
5. 2、名称空间
在书写Schema文件的时候,需要在Schema文件中 使用 targetNamespace 属性 给当前的Schema文件起名。
把targetNamespace 属性的 值 成为当前 Schema文件的名称空间。
在xml文件中 需要 通过 xmlns 来引入不同名称下的 Schema文件。
如果我们在同一个 xml文件中引入了多个 Schema的名称空间,这时需要大家 给这些名称空间其别名。
如果在xml文件使用 使用了 多个 xmlns 引入 多个名称空间时 需要 在xmlns后面 使用冒号 给当前的 名称空间 起名。通过这个别名 区分到底 当前xml中的标签 受限于 具体 哪个Schema文件。
Schema中限制xml标签中的属性定义格式:
六、xml解析
xml可扩展的标记语言。
不管是html文件还是xml文件它们都是标记型文档,都可以使用w3c组织制定的dom技术来解析。
dom解析技术是W3C组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。
Java对dom技术解析标记型文档也做了实现:
早期sun公司就制定的 dom 技术。而这个技术在页面xml的时候需要把整个xml文件加载到内存中,可以根据getElementById、getElementsByName 、getElementsByTagName 等方法解析。
sun公司在JDK6版本对 dom解析技术进行升级 :SAX解析 Stax 解析
sun公司的解析统称 JAXP。
第三方的解析:
pull、xStream、jDOM、dom4j。
七、dom4j解析技术
由于dom4j 它不是sun公司的技术,而属于第三方公司的技术,我们需要使用dom4j 就需要到dom4j官网下载dom4j的jar包。
把dom4jjar包拷贝我们的项目中:
在自己的项目中,新建一个lib文件,把dom4j jar包拷贝到其中
准备的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<name>杨过</name>
<age>18</age>
<sex>男</sex>
</user>
<user>
<name>小龙女</name>
<age>18</age>
<sex>女</sex>
</user>
</users>
1 、获取document对象
2、获取所有标签中的文本值
//演示使用dom4j 获取 xml中的标签中的数据
public static void getElement()throws Exception{
SAXReader reader = new SAXReader();
// 获取dom树
Document dom = reader.read("users.xml"); //获取xml中的根标签
Element root = dom.getRootElement(); //获取 根标签下的所有 子标签
List<Element> list = root.elements(); //遍历集合,获取到 每个 user标签
for (Element e : list) {
Element name = e.element("name");
Element age = e.element("age");
Element sex = e.element("sex");
System.out.println(name.getText() + ":" + age.getText() +":"+ sex.getText());
}
}
3.修改指定标签中的值
//把最后一个user中的sex 修改为女
public static void UpdateElement()throws Exception{
SAXReader reader = new SAXReader();
// 获取dom树
Document dom = reader.read("users.xml"); //先获取 根标签
Element root = dom.getRootElement();
//获取 users 下的所有user标签
List<Element> list = root.elements(); //获取最后一个user标签
Element lastUser = list.get(list.size()-1); Element sex = lastUser.element("sex"); sex.setText("女"); //把内存中修改后的dom树 重新写到xml文件中
//创建用于写出数据的流对象
//XMLWriter writer = new XMLWriter(new FileOutputStream("users.xml")); //创建一个格式器
OutputFormat format = OutputFormat.createPrettyPrint();
//设置编码表
format.setEncoding("gbk"); XMLWriter writer = new XMLWriter(new FileWriter("users.xml") ,format );
//写出数据
writer.write(dom);
//关流
writer.close(); }
4、删除标签
// 删除
public static void deleteElement() throws Exception {
SAXReader reader = new SAXReader();
// 获取dom树
Document dom = reader.read("users.xml"); // 删除最后一个user标签 // 先获取 根标签
Element root = dom.getRootElement();
// 获取 users 下的所有user标签
List<Element> list = root.elements(); // 获取最后一个user标签
Element lastUser = list.get(list.size() - 1); root.remove(lastUser); XMLWriter writer = new XMLWriter(new FileOutputStream("users.xml"));
writer.write(dom);
// 关流
writer.close(); }
5、增加标签
// 创建一个新的dom写到文件
public static void addElement() throws Exception { // 先创建一个dom树 这个dom树在内存中
Document dom = DocumentHelper.createDocument(); // 给树上添加根节点
Element books = dom.addElement("books"); // 给根books上添加了2个book 标签
Element book = books.addElement("book");
Element book2 = books.addElement("book"); // 给book标签上添加 子标签
Element name = book.addElement("name");
Element author = book.addElement("author");
Element price = book.addElement("price"); // 给book下的子标签中添加文本
name.setText("九阴真经");
author.addText("王炎");
price.addText("1.1"); // 给book标签上添加 子标签
Element name2 = book2.addElement("name");
Element author2 = book2.addElement("author");
Element price2 = book2.addElement("price"); // 给book下的子标签中添加文本
name2.setText("九阳神功");
author2.addText("赵敏");
price2.addText("1.2"); // 给book标签上添加属性
book.addAttribute("addr", "藏经阁");
book2.addAttribute("addr", "桃花岛"); OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream("books2.xml"),format);
writer.write(dom);
// 关流
writer.close();
}
6、工具类抽取
/**
* 这时一个工具类,它的功能是完成对dom数的获取和保存
*
* @author 上海传智播客
* @version 1.0
*/
public class DomUtils { private static Document dom = null; static{
try{
SAXReader reader = new SAXReader();
// 获取dom树
dom = reader.read("users.xml");
}catch( Exception e ){
//把异常写到日志文件中
System.out.println("恭喜您,获取dom树失败!!!");
}
}
/**
* 用于获取dom树的方法
*/
public static Document getDom(){
return dom;
} /**
* 保存dom树
*/
public static void saveDom(){
try{
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream("users.xml"),format);
writer.write(dom);
// 关流
writer.close();
}catch(Exception e){
System.out.println("恭喜您,保存dom树失败!!!");
}
}
}
八、xpath技术
xpath技术 也是 W3C 组织制定的 快速获取 xml 文件中某个 标签的 技术。
在xpath中 / 表示从根开始找标签 // 表示 不考虑标签的位置 只要匹配上就可以
//abc[@属性名] 选择abc标签,但是要求abc 必须有指定属性名
在使用xpath技术结合 dom4j 快速获取标签, 发生了异常:
如果大家以后使用的第三方jar,在运行的时候,报了 类 没有找到 异常。这时一般情况下都是缺少 jar包。
一般如果缺少jar包的话, 在报的异常中的第二个单词 或者第三个单词 是jar包的名称。
去dom4j下的lib包下去找到jaxen 然后add buildpath
JAVA企业级开发-xml基础语法&约束&解析(04)的更多相关文章
- Java学习笔记之---基础语法
Java学习笔记之---基础语法 一. Java中的命名规范 (一)包名 由多个单词组成时,所有字母小写(例如:onetwo) (二)类名和接口 由多个单词组成时,所有单词首字母大写(例如:OneTw ...
- JAVA企业级开发-session,cookie(13)
一. jsp jsp: java server pager .java动态生成网页的一门技术 使用servlet生成网页时候遇到的问题,为什么使用jsp? 在servlet里面书写htm ...
- Java Web开发——JSP基本语法杂记
在一个JSP页面中,可以包括指令标识.HTML代码.JavaScript代码.嵌入的Java代码.注释和JSP动作标识等内容.但是这些并不是JSP页面所必须的. 1 指令标识指令标识主要用于设定整个J ...
- java游戏开发之基础
© 版权声明:本文为博主原创文章,转载请注明出处 游戏图形界面开发基础 AWT:(Abstract Window Toolkit,抽象窗口工具集) AWT中包含图形界面编程的基本类库,是Java语言G ...
- JAVA企业级开发-sql入门(07)
一. 数据库 什么是数据库? 就是一个文件系统,通过标准SQL语言操作文件系统中数据 ---- 用来存放软件系统的数据 我们今天学习的数据库是mysql.关系型数据库. 什么是关系化数据库 ? 保存关 ...
- Java连载47-多态基础语法、作用
一.多态的语法 1.两个类之间没有继承关系的,使用多态是不能编译的. 2.无论向上还是向上转型,都需要有继承关系. 3.什么时候需要向下转型? 当调用的方法或者属性是子类型特有的,在父类型中不存在,就 ...
- Java程序员必备基础:内部类解析
前言 整理了一下内部类的相关知识,算是比较全,比较基础的,希望大家一起学习进步. 一.什么是内部类? 在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类.内部类本身就是类的一个属性 ...
- java企业级开发的实质就是前台后台如何交互的-各个对象之间如何交互,通信的-程序执行的流程是怎样的
1.开山鼻祖-servlet 如何将url 和 strvlet(.java文件)联系起来的 顺平说的:在xml中,url先找到xml,由对应的url的得到servlet那个类,然后就可以输入一个网址访 ...
- JAVA企业级开发-BOM&DOM(03)
一.BOM对象介绍 BOM对象:Browser Object Model 浏览器对象模型.把整个浏览器当做一个对象来处理. 一个浏览器对象中又包含了其他的对象. 重点介绍:window.history ...
随机推荐
- Tomcat学习笔记【4】--- Server.xml配置文件详解
本文主要讲如何配置Tomcat服务器. 首先展示一个BS结构图: 1 server 一个server就表示一个Tomcat实例. 1)port 指定一个端口,这个端口负责监听关闭tomcat的请求: ...
- API的理解和使用——有序集合
有序集合常用的命令 命令 功能 zadd key score member [score member ... ] 添加元素 zcard key 计算成员个数 zscore key member 计算 ...
- VC++共享文件夹
BOOL NetShare(char * pShareName,char * pSharePath) { USES_CONVERSION; SHARE_INFO_502 si502; NET_API_ ...
- Ubuntu 17.4下如何安装和配置flash player
Ubuntu Linux系统下没有自带的flash player,要自己手动安装.下面post出简单的安装过程. 首先打开终端,输入命令:sudo apt-get install flashplugi ...
- 改善C#程序的建议10:用Parallel简化Task
在命名空间System.Threading.Tasks下,有一个静态类Parallel简化了在同步状态下的Task的操作.Parallel主要提供了3个有用的方法:For.ForEach.Invoke ...
- listen 68 Theoretical Physicist Stephen Hawking Dies at 76
World-renowned British physicist Stephen Hawking, who sought to understand a range of cosmic topics ...
- OpenCV——PS滤镜 漩涡 vertex
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...
- ACM学习历程—BestCoder 2015百度之星资格赛1001 大搬家(递推 && 组合数学)
Problem Description 近期B厂组织了一次大搬家,所有人都要按照指示换到指定的座位上.指示的内容是坐在位置i 上的人要搬到位置j 上.现在B厂有N 个人,一对一到N 个位置上.搬家之后 ...
- 基于bootsplash的嵌入式linux启动画面定制
来源: ChinaUnix博客 作者: ChinaUnix博客 发布时间:2007-01-01 16:29:00 摘 要:在基于linux的嵌入式仿真平台研发中,利用开源工具bootsplash能够定 ...
- Java 核心读书笔记 第11章
1. 异常 用户希望在出现错误时,程序能够采用一些理智的行为. 如果由于出现错误而使得某些操作无法完成,程序应该: 返回到一种安全状态,并能够进行一些其他的命令: 或者:允许用于保存所有操作的结果, ...