首页 / XML / Java 基础 - XML和常见解析
Java 基础 - XML和常见解析
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java 基础 - XML和常见解析,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含9292字,纯文字阅读大概需要14分钟。
内容图文
![Java 基础 - XML和常见解析](/upload/InfoBanner/zyjiaocheng/612/b6e69ba702b749ab888e388f7739eebf.jpg)
Java 基础 - XML和常见解析
目录1 XML的概念
1.1 XML的特点和作用
1.1.1 特点
- 可拓展性,标签可以自定义
- 语法十分严格
1.1.2 作用
1.存储数据:通常,我们在数据库中存储数据。不过,如果希望数据的可移植性更强,我们可以把数据存储 XML 文件中
1.1 XML存储数据通过标签使数据更加清晰,properties也可以通过key:value的方式来存储数据,但没有xml清晰好用
2.配置文件:作为各种技术框架的配置文件使用 (最多)
3.在网络中传输:客户端可以使用XML格式向服务器端发送数据,服务器接收到xml格式数据,进行解析
2 XML 语法
2.1 XML文档声明
格式:
文档声明必须为结束;
文档声明必写在第一行;
语法格式:
<?xml version="1.0" encoding="UTF-8"?>
语法格式说明:
versioin:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;
encoding:指定当前文档的编码。可选属性,默认值是utf-8
2.2 XML元素
元素标签命名规则:
1. 不能使用空格,不能使用冒号
2. xml 标签名称区分大小写
XML 必须有且只有一个根元素
元素体的内容:
1.可以是文本
2.也可以是一个元素
普通元素:
开始标签、元素体、结束标签
空元素:
空元素只有开始标签,而没有结束标签,但元素必须自己闭合,<close/>
2.3 属性
<bean id="" class=""> </bean>
1. 属性是元素的一部分,它必须出现在元素的开始标签中
2. 属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
3. 一个元素可以有0~N个属性,但一个元素中不能出现同名属性
4. 属性名不能使用空格、冒号等特殊字符,且必须以字母开头
2.4 注释
XML中注释使用
<!-- -->
3 XML的约束
3.1 XML约束概念
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束
常见的XML约束
1.DTD
2.Schema
XML 由程序员编写,框架进行解析
XML 文件对于不同的框架要求不同,由框架提供约束文档,程序员编写XML文件时引入约束文档并遵循约束文档的要求
3.2 DTD约束文档
定义:
DTD(Document Type Definition),文档类型定义,用来约束XML文档。规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等
不要求编写,读懂会引入,常见使用DTD的框架有:
Struts2、hibernate等
文档内容:
<!ELEMENT students (student+) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
<!--
ELEMENT: 用来定义元素
students (student+) : 代表根元素 必须是 <students>
student+ : 根标签中至少有一个 student子元素, + 代表至少一个
student (name,age,sex): student 标签中包含的子元素,按顺序出现
#PCDATA: 是普通文本内容
ATTLIST: 用来定义属性
student number ID #REQUIRED
student子元素中 有一个ID属性叫做 number,是必须填写的
ID: 唯一 值只能是字母或者下划线开头
-->
3.2.1 如何引入DTD
两种引入DTD的方式:
1.内部DTD:
直接将约束规则定义在XML文档中
2.外部DTD:将约束的规则定义在外部单独的.dtd的文件中
2.1 本地:<!DOCTYPE 根标签 SYSTEM "dtd文件的位置">
2.2 网络:<!DOCTYPE 根标签 PUBLIC "dtd文件的名字" "dtd文件位置的URL">
3.3 Schema约束
什么是Schema约束:
1. Schema是新的XML文档约束, 比DTD强大很多,是DTD 替代者;
2. Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。
3. Schema 功能更强大,内置多种简单和复杂的数据类型
4. Schema 支持命名空间 (一个XML中可以引入多个约束文档)
3.3.1 Schema 约束示例
3.3.2 Schema引入步骤
1. 查看schema文档,找到根元素,在xml中写出来
<?xml version="1.0" encoding="UTF-8" ?>
<students>
</students>
2.根元素来自哪个命名空间。使用xmlns指令来声明
<students
xmlns="http://www.lagou.com/xml" >
3.引入 w3c的标准命名空间
<students
xmlns="http://www.lagou.com/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
4.使用schemaLocation来指定引入的命名空间和哪个xsd文件对应:两个取值:第一个为命名空间 第二个为xsd文件的路径
<students
xmlns="http://www.lagou.com/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.lagou.com/xml student.xsd"
>
4 XML解析
4.1 常见XML解析方式(两种)
1 DOM
要求解析器把整个XML文档装载到内存,并解析成一个Document对象
优点:
元素与元素之间保留结构关系,故可以进行增删改查操作
缺点:
XML文档过大,可能出现内存溢出显现
2 SAX
是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件
优点:占用内存少 处理速度快,可以处理大文件‘
缺点::只能读,逐行后将释放资源
DOM 树结构:
4.2 XML常见解析器
JAXP:sun公司提供的解析器,支持DOM和SAX两种思想
DOM4J:一款非常优秀的解析器 , Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP
Jsoup:jsoup 是一款Java 的HTML解析器 ,也可以解析XML
PULL:Android内置的XML解析方式,类似SAX
4.3 dom4j 的使用
4.3.1 核心API
使用核心类SaxReader加载xml文档获得Document,通过Document 对象获得文档的根元素
常用API
SaxReader对象 - read(…) 加载执行xml文档
Document对象 - getRootElement() 获得根元素
Element对象
- elements(…) 获得指定名称的所有子元素。可以不指定名称
- element(…) 获得指定名称的第一个子元素。可以不指定名称
- getName() 获得当前元素的元素名
- attributeValue(…) 获得指定属性名的属性值
- elementText(…) 获得指定名称子元素的文本值
- getText() 获得当前元素的文本内容
4.3.2 通过核心API 获取标签名和值
// 获取到根标签
Element rootElement = document.getRootElement();
// getName 方法可以获取到标签名,如<xxx><xxx/>中的xxx
System.out.println(rootElement.getName());
// 获取到所有根标签下的次级标签,如<users>里的所有<user>
List<Element> elements = rootElement.elements();
for (Element element : elements) {
// 打印次级标签里的标签名,如<user>
System.out.println(element.getName());
//获取到次级标签里的其他所有标签,如<user>里的<name>,<age>,<sex>
List<Element> list = element.elements();
// 获取到根标签
Element rootElement = document.getRootElement();
//拿到所有的id和其对应值
// 获取到根标签里的所有次机标签,如所有<user>
List<Element> elements = rootElement.elements();
for (Element element : elements) {
// 通过attribute 方法可以拿到该标签里指定位置的属性
Attribute attribute = element.attribute(0);
// 通过getName 和 getValue 方法可以拿到属性的属性名和值
System.out.println(attribute.getName()+": "+attribute.getValue());
// 或者直接通过attributeValue("name") 方法直接拿到标签里指定属性的值,如<user id="xx">
System.out.println(element.attributeValue("id"));
}
//拿到第二条记录的所有属性名和值
// 获取到根标签下的所有次级标签
List<Element> elements1 = rootElement.elements();
//可以通过get(id) 方法拿到xml文件中所有次级标签中的指定的某一个,如<users>第二个<user>
Element e2 = elements1.get(1);
List<Element> elements2 = e2.elements();
for (Element element : elements2) {
// 拿掉每个标签的名称(getName)和其对应的文本值(getText),如<name>xxx<name/>
System.out.println(element.getName()+": "+element.getText());
}
//或者直接通过elementText("name") 方法拿到该标签下名称指定的次级标签内的文本值
System.out.println(e2.elementText("name"));
System.out.println(e2.elementText("age"));
System.out.println(e2.elementText("hobby"));
4.4 Xpath
4.4.1 Xpath 基本概念
Xpath 的作用:
XPath是一门在XML文档中查找信息的语言,可以是使用xpath查找xml中的内容
Xpath 的优点:
于DOM4J在解析XML时只能一层一层解析(通过Element.elements),所以当XML文件层数过多时使用会很不方便,结合XPATH就可以直接获取到某个元素
Xpath 的使用:
通过导入 jaxen jar包实现
4.4.2 Xpath 的基本语法
dom4j 所支持的Xpath操作的主要形式:
/AAA/DDD/BBB 表示一层一层的,AAA下面 DDD下面的BBB
//BBB 表示和这个名称相同,表示只要名称是BBB,都得到
//* 所有元素
BBB[1] , BBB[last()] 第一种表示第一个BBB元素, 第二种表示最后一个BBB元素
attribute::xx 获得某一标签的xx属性node
//BBB[@id] 表示只要BBB元素上面有id属性,都得到
//BBB[@id='b1'] 表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1
4.4.3 Xapth 的常用API
selectSingleNode(query):
- 查找和XPath查询匹配的一个节点
- 参数是Xpath 查询串
selectNodes(query):
- 得到的是xml根节点下的所有满足 xpath 的节点
- 参数是Xpath 查询串
以上方法的返回值都是Node 节点对象,List集合的时候返回结果可以为Element类型,一位内Element为Node的子接口,本身返回的接口没有指定具体类型
也可以强制类型转换将Node转为Element
Element element = (Element) node;
示例:
// 获取所有书的name节点和书名
String Xpath1 = "/bookstore/book//name";
//或者 String Xpath5 = "//name";
List<Node> list = document.selectNodes(Xpath1);
for (Node element : list) {
System.out.println(element.getName()+": "+element.getText());
}
// 获取第二本书的书名,作者和价格
String Xpath2 = "/bookstore/book[2]//*";
List<Node> list1 = document.selectNodes(Xpath2);
for (Node node : list1) {
System.out.println(node.getName()+": "+node.getText());
}
// 获取最后一本书的id属性值
String Xpath3 = "/bookstore/book[last()]/attribute::id";
Node node = document.selectSingleNode(Xpath3);
System.out.println(node.getText());
// 获取id属性为book2 的书的书名
String Xpath4 = "/bookstore/book[@id='book2']";
// 此时拿到的为<book id=book2>的node,node里还包含了<name>,<author>,<price>
Node node1 = document.selectSingleNode(Xpath4);
// 在<book> node 里拿到<name> node
Node node2 = node1.selectSingleNode("name");
System.out.println(node2.getText());
// 两种方式都可以获得指定标签里的attribute,document.selectNodes 方法返回的集合可以是Node类型也可以是Element
/*String Xpath = "//bean/attribute::name";
List<Node> list = document.selectNodes(Xpath);
for (Node node : list) {
System.out.println(node.getText());
}*/
String Xpath = "//bean";
List<Element> list = document.selectNodes(Xpath);
for (Element element : list) {
System.out.println(element.attributeValue("name")+": "+element.attributeValue("class"));
}
内容总结
以上是互联网集市为您收集整理的Java 基础 - XML和常见解析全部内容,希望文章能够帮你解决Java 基础 - XML和常见解析所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。