目录,更新ing,学习Java的点滴记录
目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录
Xml概念和体系
- Xml概念
Xml是指可扩展标记语言(Extensible Markup Language)
Xml没有预定义标签,需要自行定义标签
预定义标签在HTML语言中十分常见,比如下面示例中,title标签指的就是网站的标题,功能是定义好的

- Xml特点
Xml数据以纯文本格式进行存储,实现了不同应用程序之间的数据通信;实现不同平台间的数据通信|数据共享,使用Xml将不同的程序|平台联系起来 - Xml作用:
数据存储和数据传输 - Xml与Html区别:
设计目的不同,Xml被设计为存储和传输数据,而Html设计为显示数据,关注数据的外观 - 用案例简单解释Xml结构


- Xml文件的体系

Xml基本语法
- 基本语法
1) 有且只有一个根元素
2) Xml文档声明必须放在文档第一行
3) 所有标签必须成对出现
4) Xml标签严格区分大小写
5) XML必须正确嵌套
6) XML中的属性值必须加引号
7) XML中,一些特殊字符需要使用“实体”

8) XML中可以应用适当的注释 - 元素
1) XML元素指的是开始标签到结束标签的部分
2) 一个元素中可以包含
其他元素| 文本|属性|或者三者混合 - 命名规则
1) 名称可以包含字母、数字及其他字符
2) 名称不能以数字或者标点符号开始
3) 名称不能以xml开始
4) 名称不能包含空格 - 简单示例

Schema技术介绍
- DTD验证
1) 概念:DTD文档类型定义
2) 作用:验证是否为"有效"的XML,对xml文档的书写内容进行规范约束
3) 案例(了解即可,有更可靠的技术可以使用)

当你修改下面的标签时,如果不符合上面使用DTD描述的约束语法,则会报错
4) 使用DTD局限性
a. DTD不遵守XML语法
b. DTD数据类型有限
c. DTD不可扩展
d. DTD不支持命名空间 - Schema技术
1) Schema是DTD的代替者,名称为XML Schema,用于描述XML文档结构,比DTD更加强大,最主要的特征之一就是XML Schema支持数据类型
a. Schema遵循XML的语法
b. Schema可以用能处理XML文档的工具处理
c. Schema大大扩充了数据类型,而且还可以自定义数据类型
d. Schema支持元素的继承
e. Schema支持属性组
2) 示例

a. 所有的schema文档使用schema作为其根元素
b. http://www.w3.org/2001/XMLSchema:表示用于验证当前schema文档的命名空间(用于验证schema本身)同时它还规定了来自命名空间http://www.w3.org/2001/XMLSchema的元素和数据类型应该使用前缀xs
c. xmlns:相当于java中的import
d. :xs : 在使用时要写"小名"作为前缀
3. Xml使用schema验证,那schema也是一个xml,它由DTD来验证
3)使用Schema验证xml文档的步骤
a. 创建SchemaFactory工厂
b. 建立验证文件对象
c. 利用SchemaFactory工厂对象,接收验证的文件对象,生成Schema对象
d. 产生对此Schema的验证器
e. 要验证的数据(准备数据源)
f. 开始验证
4) 示例代码



可以采用这种代码的方式对XML文件进行验证,实际上这样已经是没有必要的了,当你写好了上面的Animal.xsd和Animal.xml文件,并将Animal.xsd引入到了Animal.xml中,就会自动对你xml中的内容进行规范检查了
&ems;
上图就是自动检查的结果
4种解析XML数据的方式
- 什么叫解析:
在java程序汇总读取xml文件的过程称为解析xml - 解析方式
1) DOM解析(java官方提供)
2) SAX解析(java官方提供)
3) JDOM解析(第三方提供)
4) DOM4J解析(第三方提供) - 解析案例的xml文件内容
<?xml version="1.0" encoding="UTF-8"?>
<animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Animals.xsd">
<animal id="1001">
<name>Dog</name>
<age>11</age>
<color>Black</color>
</animal>
</animals>
DOM方式解析Xml数据
- 解析步骤
1) 创建一个DocumentBuilderFactory的对象
2) 创建一个DocumentBuilder的对象
3) 通过DocumentBuilder的parse(…)方法得到Document对象
4) 通过getElementsByTagName(…)方法获取到节点的列表
5) 通过for循环遍历每一个节点
6) 得到每个节点的属性和属性值
7) 得到每个节点的节点名和节点值 - 示例代码
public class TestDOM {
public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
// 1.创建一个DocumentBuilderFactory的对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.创建一个DOcumentBuilder的对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 3.通过DocumentBuilder的parse(...)方法得到Document对象
Document document = builder.parse(new File("src/com/test/Animals.xml"));
// 4.通过getElementsByTagName(...)方法获取到节点的列表
NodeList nodes = document.getElementsByTagName("animal");
System.out.println("得到的animal节点个数为:"+nodes.getLength());
// 5.通过for循环遍历每一个节点
for(int i=0;i<nodes.getLength();i++){
// 6.得到每个节点的属性和属性值
Node animal = nodes.item(i);
NamedNodeMap attributes = animal.getAttributes();
for(int j=0;j<attributes.getLength();j++){
//得到每一个属性
Node item = attributes.item(j);
System.out.println("属性名称:"+item.getNodeName()+","+"属性值:"+item.getNodeValue());
}
// 7.得到每个节点的子节点属性和属性值
NodeList childNodes = animal.getChildNodes();
for(int j=0;j<childNodes.getLength();j++){
Node item = childNodes.item(j);
//这里需要注意的是 xml中空白位置也会被当做节点,是空文本输出没有意义
// 比如</name>与<age>之间的部分也叫节点
short type = item.getNodeType();
if (type==Node.ELEMENT_NODE){ // 当节点为元素节点时才输出
System.out.println("子节点名:"+item.getNodeName()+",节点值:"+item.getNodeValue());
}
}
}
}
}

SAX方式解析Xml数据
- 介绍
SAX,全称 Simple API for XML,是一种以事件驱动的XML API,SAX与DOM不同的是它边扫描边解析,自顶向下一次解析,由于边扫描边解析,所以它解析XML具有速度快,占用内存少的优点。 - 解析步骤
1) 创建SAXParserFactory的对象
2) 创建SAXParser对象(解析器)
3) 创建一个DefaultHandler的子类
4) 调用parse方法
PS:具体的解析信息可以在自定义的DefaultHandler的子类重写的方法中查看 - 示例
自定义DefaultHandler子类
public class AnimalDefaultHandler extends DefaultHandler {
//解析xml开始时调用
@Override
public void startDocument() throws SAXException {
System.out.println("开始解析");
}
//解析xml结束时调用
@Override
public void endDocument() throws SAXException {
System.out.println("结束解析");
}
//解析xml文档中节点开始时调用
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// 1. 解析animal节点属性值
if ("animal".equals(qName)){
//2. 获取该标签的所有属性
int length = attributes.getLength();
for(int i=0;i<length;i++){
String name = attributes.getQName(i);//属性名称
String value = attributes.getValue(i);//属性值
System.out.println("属性名称:"+name+",属性值:"+value);
}
}else if(!"animal".equals(qName) && !"animals".equals(qName)){ //如果不是animal节点,那么文件中就是子节点了
System.out.print("子节点名称:"+qName);
}
}
//解析xml文档中节点结束时调用
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
}
//获取节点值的方法
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String value = new String(ch, start, length);
//同样也需要去掉一些空白节点
if(!"".equals(value.trim())){
System.out.println(" "+value);
}
}
}
public class TestSAX {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
// 1)创建SAXParserFactory的对象
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2)创建SAXParser对象(解析器)
SAXParser parser = factory.newSAXParser();
// 3)创建一个DefaultHandler的子类
AnimalDefaultHandler handler = new AnimalDefaultHandler();
// 4)调用parse方法
parser.parse("src/com/test/Animals.xml",handler);
}
}
JDOM解析Xml数据
- 介绍
JDOM是一种解析XML的JAVA工具包,它基于树形结构,利用纯JAVA的技术对XML文档实现解析,所以适合于JAVA语言 - 解析步骤
1) 创建一个SAXBuilder对象
2) 调用build方法,得到Document对象(通过IO流)
3) 获取根节点
4) 获取根节点的直接子节点的集合
5) 遍历集合 - 需要导入jar包:jdom.jar 链接:https://pan.baidu.com/s/1-WPT8vHCWUao3-q6gkUgJQ 提取码:or5c
- 示例
public class TestJDOM {
public static void main(String[] args) throws IOException, JDOMException {
// 1)创建一个SAXBuilder对象
SAXBuilder builder = new SAXBuilder();
// 2)调用build方法,得到Document对象(通过IO流)
Document document = builder.build(new FileInputStream("src/com/test/Animals.xml"));
// 3)获取根节点
Element root = document.getRootElement();//Animals节点
// 4)获取根节点的直接子节点的集合
List<Element> animalList = root.getChildren(); //得到animal的子节点book
// 5)遍历集合
for(int i=0;i<animalList.size();i++){
Element animal = animalList.get(i);//拿到一个animal子节点
// 获取该节点的所有属性 示例中只有一个id属性
List<Attribute> attributes = animal.getAttributes();
for(int j=0;j<attributes.size();j++){
Attribute attr = attributes.get(j);
System.out.println("属性名称:"+attr.getName()+",属性值:"+attr.getValue());
}
//获取每个animal子节点下的子标签
List<Element> children = animal.getChildren();
for (Element child : children) {
System.out.println("子节点名:"+child.getName()+",子节点值:"+ child.getValue());
}
}
}
}
DOM4J解析XML数据(使用最多的)
- 介绍
DOM4J是一个JAVA的XML API,是JDOM的升级品,用来读写XML文件的 - 解析步骤
1) 创建SAXReader对象
2) 调用read方法
3) 获取根元素
4) 通过迭代器遍历直接节点 - 需要导入jar包: dom4j.jar 链接:https://pan.baidu.com/s/1-KV4TWm5mFv7nZA0MbVV-Q 提取码:vbdw
- 示例----
解析Animal.xml,并将得到的数据封装到Animal实体类中

public class TestDOM4J {
public static void main(String[] args) throws DocumentException {
// 1)创建SAXReader对象
SAXReader saxReader = new SAXReader();
// 2)调用read方法
Document document = saxReader.read(new File("src/com/test/Animals.xml"));
// 3)获取根元素
Element rootElement = document.getRootElement();
//创建保存Animal实体类的集合
ArrayList<Animal> list = new ArrayList<>();
// 4)通过迭代器遍历animals的直接子节点animal
for(Iterator<Element> iterator = rootElement.elementIterator();iterator.hasNext();){
//创建Animal类对象
Animal a = new Animal();
Element animal = iterator.next();//取得每个直接子节点animal
// 获取animal的属性值即示例中的id值
for(Iterator<Attribute> animalIterator = animal.attributeIterator(); animalIterator.hasNext();){
Attribute attr = animalIterator.next();
System.out.println("属性名:"+attr.getName()+",属性值:"+attr.getValue());
}
//获取animal的子节点中的名称和值
for(Iterator<Element> subIterator = animal.elementIterator();subIterator.hasNext();){
Element element = subIterator.next();
System.out.println("子节点名称:"+element.getName()+",子节点值:"+element.getText());
String aname = element.getName();//节点名称 name,age,color
switch (aname){
case "name":
a.setName(element.getText());
break;
case "age":
a.setAge(Integer.parseInt(element.getText()));
break;
case "color":
a.setColor(element.getText());
break;
default:
break;
}
}
list.add(a);
}
// 遍历保存的Animal集合
for (Animal animal : list) {
System.out.println(animal);
}
}
}

四种解析方式总结
- DOM解析
形成了树结构,有助于更好的理解,掌握,且代码容易编写.解析过程中,树结构保存在内存中,方便修改 - SAX解析
采用事件驱动模式,对内存耗费比较小,适用于只处理xml文件中的数据 - JDOM解析
仅使用具体类,而不使用接口,API大量使用了集合类 - DOM4J解析
JDOM的一种智能分支,它合并了许多超出基本xml文档表示的功能,它使用接口和抽象类基本方法,具有性能优异,灵活性好,功能强大和易用的特点,是一个开放源码的文件.
XPATH快速获取节点
- 介绍
Xpath是一种在xml文档汇总快速查找信息的方式,在上述4中方式中,查找节点都是一层一层,或者自顶向下解析,想想如果有很多层结构,那将会非常麻烦,但是使用XPATH就很简单了 - 准备jar包: dom4j.jar和Jaxen.jar 链接:https://pan.baidu.com/s/1v60GjwdFZUWx9Nz05RX5uQ 提取码:dq47
- 首先放一个XPATH的中文教程文档,打开后
选择中文即可,附几张图,非常容易理解
链接:https://pan.baidu.com/s/1dv8WdCWskm2i45Dmo1HVTg 提取码:3rjm



- 步骤
1) 创建SAXReader对象
2) 读取指定Xml文件
3) 使用selectSingleNode结合XPATH语法进行获取节点 - 示例

711

被折叠的 条评论
为什么被折叠?



