JAVA基础-XML的解析
一、XML的概述
XML的全名为可扩展标记语言(Extensible Markup Language),XML的作用为:1、传输,2、存取数据,3、软
件的配置文件。传输现在都用更轻量的Json,而存储则用数据库。所以软件的配置文件是现在的XML的主要用途。
现在的一些主流框架都是使用XML进项配置的。
(一)XML的基本语法
1、XML的文档声明:通常出现在XML的第一行第一列的位置!
写法:
<?xml 属性名=”属性值” 属性名=”属性值” ...?>
* version :必须的. 使用”1.0”
* encoding :字符集. 是使用浏览器打开的时候采用的默认的字符集的编码.
* standalone :描述XML文档是否需要依赖其他的文件.
举例:<?xml version="1.0" encoding="UTF-8"?>
2、XML的注释
写法:
<!-- XML的注释 -->
3、XML的元素:xml中的元素其实就是一个个的标签 - a: 包含标签体(<>成对儿出现),b: 不包含标签体
(<元素名 属性/>)
举例:
a:
<student>
<name>zhangsan</name>
<age>18</age>
</student>
b:
<student
name="zhangsan"
age="18"
/>
元素的命名规范:
* 严格区分大小写;<a><A>
* 只能以字母或下划线开头;abc _abc
* 不能以xml(或XML、Xml等)开头;
* 名称字符之间不能有空格或制表符;
* 名称字符之间不能使用冒号;
4、XML元素中的属性:一个元素可以有多个属性,每个属性都有它自己的名称和取值。
写法:
* 属性值一定要用引号(单引号或双引号)引起来。
* 属性名称的命名规范与元素的命名规范相同
* 元素中的属性是不允许重复的
5、XML的特殊字符和CDATA区
特殊字符:
CDATA区的写法:
<![CDATA[ 内容 ]]>
二、XML的约束
在XML中都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。
(如:Tomcat),所以就可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束。XML的约束就是
用来约束XML的文档中可以出现哪些标签,不能出现哪些标签,标签中是否有顺序,出现的次数。XML的约束
包括2种:1、DTD,2、Schema。
两者的区别:
* 语法的不同,DTD的语法自成一体而Schema的语法则和XML类似。
* Schema具有命名空间
* Schema具有更强强的语义和约束
* Schema能够更好地被解析器解析
(一)DTD约束
1、DTD中定义元素:在DTD文档中使用ELEMENT关键字来声明一个XML元素。
语法:
<!ELEMENT 元素名称 使用规则>
元素的一些约束规则:
* (#PCDATA):指示元素的主体内容只能是普通的文本.(Parsed Character Data)
* EMPTY:用于指示元素的主体为空。比如<br/>
* ANY:用于指示元素的主体内容为任意类型。
* (子元素):指示元素中包含的子元素
* 如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档
* 如果子元素用"|"分开,说明任选其一。
* 用+(至少一次)、
*(可有可无,零次、一次或多次)、
?(可以有也可以无,有的话只能有一次。零次或一次)来表示元素出现的次数
2、DTD中定义属性:在DTD文档中使用ATTLIST关键字来为一个元素声明属性。
写法:
<!ATTLIST 元素名
属性名1 属性值类型 设置说明
属性名2 属性值类型 设置说明
......
>
属性的类型和约束:
* CDATA:表示属性的取值为普通的文本字符串
* ENUMERATED (DTD没有此关键字):表示枚举,只能从枚举列表中任选其一
* ID:表示属性的取值不能重复
* #REQUIRED:表示该属性必须出现
* #IMPLIED:表示该属性可有可无
* #FIXED:表示属性的取值为一个固定值。语法:#FIXED "固定值"
例子:
<?xml version="1.0" encoding="UTF-8"?>
<!--根元素有且只能有一个 -->
<!ELEMENT 例子 (数+)>
<!ELEMENT 数 (1,2,3,4)>
<!ELEMENT 1 (#PCDATA)>
<!ELEMENT 2 (#PCDATA)>
<!ELEMENT 3 (#PCDATA)>
<!ELEMENT 4 (#PCDATA)>
3、DTD的引用方式
* 内部引用DTD:
<!DOCTYPE persons [
]>
* 外部引用DTD:
* 本地DTD:
<!DOCTYPE persons SYSTEM "***.dtd">
* 网络DTD:
<!DOCTYPE persons PUBLIC "url" "***.dtd">
(二)Schema约束
一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档。
Schema约束自身就是一个XML文件,但它的扩展名通常为.xsd。Schema支持名称空间。名称空间:可以理
解为JAVA里的package,约束文档:可以理解为一个JAVABean类,实例文档:就是通过JAVABean类创建的实
例对象。
可以通过命名空间来分辨出约束文档(W3C的命名空间:xmlns="http://www.w3.org/2001/XMLSchema")
,实例文档(W3C的命名空间:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance")W3C的命名空间
后缀名为instance的为实力文档。
举例:
*Schema文件
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.xmldemo.com"
elementFormDefault="qualified">
<element name="persons">
<!-- 复杂元素 -->
<complexType>
<!-- 有序的,最大值不限定,最小值为一 -->
<sequence maxOccurs="unbounded" minOccurs="1">
<element name="person">
<complexType>
<sequence>
<!-- 简单表签 -->
<element name="name" type="string"></element>
<element name="age" type="int"></element>
<element name="sex" type="string"></element>
</sequence>
<!-- 属性,在有序和复杂元素之间 -->
<attribute name="id" type="int" />
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
*实例文档
<?xml version="1.0" encoding="UTF-8"?>
<p:persons xmlns:p="http://www.xmldemo.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.xmldemo.com schame.xsd ">
<p:person>
<p:name>p:name</p:name>
<p:age>0</p:age>
<p:sex>p:sex</p:sex>
</p:person>
</p:persons>
写的好约束文件可以使用eclipse自动引入:
1、
2、
三、XML的解析
XML的解析一共有2种方式:DOM解析:(DOM:Document Object Model)SAX解析:(Simple Api for XML)
* DOM:文档对象模型。这种方式是W3C推荐的处理XML的一种方式。
* SAX:这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。
两者的解析方式的优缺点
* DOM解析是一次把DOM树都加载到内存里进行解析,可以对其进行增删改,但是当解析的XML比较大的
时候可能会造成内存溢出。
* SAX解析是以事件驱动的方式一行一行进行解析的,不会造成内存的溢出,但是不能对XML进行修改。
针对这两种解析的方式,不同的公司提供了不同的API的实现
* JAXP :SUN公司提供的一套XML的解析的API.
* JDOM :开源组织提供了一套XML的解析的API-jdom.
* DOM4J :开源组织提供了一套XML的解析的API-dom4j.
* pull :主要应用在Android手机端解析XML.
java中常用的API为DOM4J。
(一)DOM4J
DOM4J的常用的构造和方法:
* 创建SAXReader对象:new SAXReader()
* 设置读取路径返回Document对象对XML进行操作:
reader.read(要读取XML的路径);
* 创建OutputFormat对象设定输出格式: OutputFormat.createPrettyPrint()
* 根据输出路径和输出格式创建输出对象:
new XMLWriter(new FileOutputStream(输出路径, 输出格式);
DOM4J的常用方法:
* 获取根元素对象(根标签):
返回值类型 - Element,调用对象 - Document getRootElement();
* 获取所有的子元素:
返回值类型 - List ,调用对象 - Element elements();
* 根据指定的元素名称来获取相应的所有的子元素:
返回值类型 - List ,调用对象 - Element elements(String name);
* 根据指定的子元素名称,来获取子元素中的文本:
返回值类型 - String ,调用对象 - Element elementText(String name);
* 获取当前元素对象的文本:
返回值类型 - String ,调用对象 - Element getText();
* 设置当前元素对象的文本:
返回值类型 - void ,调用对象 - Element setText(String text);
* 添加当前元素对象的文本:
返回值类型 - Element ,调用对象 - Element addText(String text);
* 根据指定的属性名称获取其对应的值:
返回值类型 - String ,调用对象 - Element attributeValue(String name);
* 根据指定的属性名称和值进行添加或者修改:
返回值类型 - Element ,调用对象 - Element addAttribute(String name,String value);
* 删除某一元素(需父类对象删除子元素):
返回值类型 - void ,调用对象 - Element remove(Element element);
* 在目标节点中添加新的节点:
返回值类型 - Element ,调用对象 - Element addElement(String name);
* 创建一个新的元素对象:
返回值类型 - Element,调用对象 - DocumentHelper DocumentHelper.createElement(String name);
(二)示例代码
* 目标XML文件:
<?xml version="1.0" encoding="UTF-8"?> <State Code="37" Name="河南" description="郑州" GDP="99999亿" YY="你YY个啥劲儿">
<City>
<Name>郑州</Name>
<Region>高薪区</Region>
</City>
<City>普吉岛</City>
<City>三门峡</City>
<City>安阳</City>
<City>南阳</City>
<City>北京</City>
</State>
* 工具类:
public class Dom4jUtils {
//私有构造
private Dom4jUtils() {
super();
// TODO Auto-generated constructor stub
}
//创建Document对象
public static Document creatDocument() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read("src\\com\\xmldemo\\city.xml");
return document;
}
//创建输出对象
public static void write(Document d) throws Exception {
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream("src\\com\\xmldemo\\city.xml"), format);
writer.write(d);
}
}
* 一顿操作:
/**添加或修改属性,如果没有该属性就添加有的话就更新
* @throws Exception
*/
private static void method07() throws Exception {
Document document = Dom4jTUtils.creatDocument();
Element rootElement = document.getRootElement();
//为根元素添加YY属性和值
Element element = rootElement.addAttribute("YY", "你YY个啥劲儿");
Dom4jTUtils.write(document);
} /**打印某一节点的属性
* @throws Exception
*/
private static void method06() throws Exception {
Document document = Dom4jTUtils.creatDocument();
Element rootElement = document.getRootElement();
//获取Name属性的值
String value = rootElement.attributeValue("Name");
System.out.println(value);
} /**在某一标签位置添加新标签
* @throws Exception
*/
private static void method05() throws Exception {
Document document = Dom4jTUtils.creatDocument();
Element rootElement = document.getRootElement();
// 创建一个新元素对象
Element createElement = DocumentHelper.createElement("City");
//为此元素设置值
createElement.setText("普吉岛");
//遍历
List<Element> list = rootElement.elements();
//将此节点加入到list集合的指定位置
list.add(1, createElement);
//写回
Dom4jTUtils.write(document);
} /**像某已指定元素添加元素
* @throws Exception
*/
private static void method04() throws Exception {
Document document = Dom4jTUtils.creatDocument();
Element rootElement = document.getRootElement();
//在Root节点下添加一个新节点"City"
Element addElement = rootElement.addElement("City");
//为节点添加文本
addElement.addText("北京");
//写回
Dom4jTUtils.write(document);
} /**删除某一元素
* @throws Exception
*/
private static void methed03() throws Exception {
Document document = Dom4jTUtils.creatDocument();
Element rootElement = document.getRootElement();
List<Element> list = rootElement.elements();
//获取要删除元素的父元素(删除只能由父亲删除儿子)
Element parent = list.get(2).getParent();
//删除
parent.remove(list.get(2));
//将document写回
Dom4jTUtils.write(document);
} /**修改某一标签的文本
* @throws Exception(为了方便抛出大的异常)
*/
private static void medom02() throws Exception {
Document document = Dom4jTUtils.creatDocument();
Element rootElement = document.getRootElement();
List<Element> list = rootElement.elements();
//设置第三个元素的文本
list.get(2).setText("青青草原");
//使用工具类将document写回XML文档
Dom4jTUtils.write(document);
} /**获取第一个元素的Name属性
* @throws Exception(为了方便抛出大的异常)
*/
private static void method() throws Exception {
//使用工具类创建Document对象
Document document = Dom4jTUtils.creatDocument();
//获得根节点
Element element = document.getRootElement();
//获得根节点下的所有元素节点
List<Element> elements = element.elements();
//获取第一个节点的Name属性文本
String name = elements.get(0).elementText("Name");
System.out.println(name);
} /**用递归的方式遍历所有元素
* @param elements 根节点
*/
public static void run(Element elements) {
//打印每个元素的名字
System.out.println(elements.getName());
//获取每个节点
List<Element> elements2 = elements.elements();
//递归调用
for (Element object : elements2) {
run(object);
}
}
JAVA基础-XML的解析的更多相关文章
- JAVA 中XML的解析
XML: 可扩展标记语言(extensible Markup Language) 用于标记电子文件使其具有结构性的标记语言.XML可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定 ...
- java dom4j xml生成,解析
1. 用Java代码生成xml文档 package com.test.dom; import java.io.FileOutputStream; import java.io.IOException; ...
- Java对XML文件解析方式之一_SAX
SAX(org.xml.sax) Simple API for XML,以事件的形式通知程序,对Xml进行解析. SAX技术的介绍:SAX是一种以事件驱动的XML api,由它定义的事件流可以指定 ...
- java基础 xml 使用dom4j解析 xml文件 servlet根据pattern 找到class
package com.swift.kaoshi; import java.io.File; import java.util.List; import java.util.Scanner; impo ...
- JAVA基础 XML生成与解析和String包装类下 .replace方法的使用以及char和字符序列的使用场景
ptLink0.setText(arbu.getPtLink().replace("&","&")); // 如果像 '&','& ...
- 你必须掌握的Java基础:JSON解析工具-json-lib
一.简介 json-lib是一个Java类库,提供将Java对象,包括beans,maps,collections,java arrays和xml等转换成JSON,或者反向转换的功能. 二.准备 在 ...
- java基础(9) - 泛型解析
泛型 定义简单的泛型类 泛型方法 /** * 1.定义一个泛型类 * 在类名后添加类的泛型参数 <T> * 泛型类里面的所有T会根据创建泛型类时传入的参数确定类型 * 2.定义泛型方法 * ...
- java 之 xml 之解析工具jaxp
一.jaxp的api查看 *jaxp是javase一部分 *jaxp解析器在jdk的javax.xml.parsers包里面 *共四个类:分别针对dom和sax解析使用的类 *dom解析类: Docu ...
- java基础(八) 深入解析常量池与装拆箱机制
引言 本文将介绍常量池 与 装箱拆箱机制,之所以将两者合在一起介绍,是因为网上不少文章在谈到常量池时,将包装类的缓存机制,java常量池,不加区别地混在一起讨论,更有甚者完全将这两者视为一个整体, ...
随机推荐
- java程序与编译
Java 源文件(.java) 使用 Java编译器(javac.exe)编译 生成 java字节码文件(.class) 使用 解释执行器(java.exe) 将字节码文件加载到java虚拟机(j ...
- 基于pytorch实现HighWay Networks之Train Deep Networks
(一)Highway Networks 与 Deep Networks 的关系 理论实践表明神经网络的深度是至关重要的,深层神经网络在很多方面都已经取得了很好的效果,例如,在1000-class Im ...
- java equals()方法
java基础学习总结--equals方法 一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class Te ...
- 封装好的图片滑动框架(AndroidImageSlider)
前言 广告轮播条的重要性不言而喻.在很多类型app中出场率都很高. 今天给大家介绍一个轮播图开源项目,这个项目把轮播图需要的ViewPager跟计时器做了封装,使用极其方便,支持gradle在线依赖. ...
- Class.getResource和ClassLoader.getResource的区别分析
原文:http://swiftlet.net/archives/868 在Java中获取资源的时候,经常用到Class.getResource和ClassLoader.getResource,本文给大 ...
- 一次生产环境下MongoDB备份还原数据
最近开发一个版本的功能当中用到了MongoDB分页,懒于造数据,于是就研究了下从生产环境上导出数据到本地来进行测试. 研究了一下,发现MongoDB的备份还原和MySQL语法还挺类似,下面请看详细介绍 ...
- JavaScript 版数据结构与算法(二)队列
今天,我们要讲的是数据结构与算法中的队列. 队列简介 队列是什么?队列是一种先进先出(FIFO)的数据结构.队列有什么用呢?队列通常用来描述算法或生活中的一些先进先出的场景,比如: 在图的广度优先遍历 ...
- less使用ch1--认识语法
@charset "utf-8"; //注释------------------------------ /*我是可以被编译出来的*/ //不能被编译出来 //变量-------- ...
- jsp 四大域范围
JSP中四种作用域的不同 作用域规定的是变量的有效期限. 1.如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里. 从把变量放到pageCont ...
- Jquery实现数据双向绑定(赋值和取值),类似AngularJS
<!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...