Fork me on GitHub

XML 技术

本系列文章在 https://github.com/freestylefly/javaStudy 持(jing)续(chang)更(duan)新(geng)中,欢迎有兴趣的童鞋们关注。

XML简介

1、XML是可扩展标记语言
2、与操作系统和操作平台均无关
3、规范统一,支持异构系统
在这里插入图片描述

XML文档结构

在这里插入图片描述

1、XML声明

<?xml version=”1.0” encoding=”UTF-8” ?>


注意:这里需要修改的encoding,如果出现乱码,需要改成GBK

2、标签

元素名 元素属性名=“属性值” 元素内容
在这里插入图片描述

3、根元素

写在声明下面的标签元素,有且只有一个根元素

4、属性

一个元素可以有多个属性,多个属性之间用空格分开


注意:属性可以加在任何一个元素的其实标签上,但不能加在结束标签上,且不能包含特殊字符< “ .&

5、特殊字符的处理

在这里插入图片描述

XML编写注意事项

在这里插入图片描述

XML命名空间

命名空间是在解析XML文档时,对于重名的元素,可能出现解析冲突,他们用来标识来自特定域(标准组织、公司、行业)的名称
除非带有前缀,否则属性属于他们的元素所在的命名空间

验证XML文档

DTD验证

DOM解析XML

1、步骤

(1)创建解析器工厂

1
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

(2)创建解析器

1
DocumentBuilder builder =factory.newDocumentBuilder();

(3)获得Document

1
document=builder.parse("src/info.xml");

(4)创建解析器工厂

以Document对象为起点对DOM树的节点进行增加、删除、修改查询等操作

2、关键代码(包含增删该查操作)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package demo1;

import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
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;

public class Test1 {
private Document document;

/**
* 创建Document对象
* @throws IOException
* @throws Exception
*/
public void getDoc() throws Exception, IOException {
//解析器工厂
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder builder =factory.newDocumentBuilder();
//获得Document
document=builder.parse("src/info.xml");
}


/**
* 保存XM
* @throws Exception
*/
public void save() throws Exception {
TransformerFactory factory =TransformerFactory.newInstance();
factory.setAttribute("indent-number", 4);//天假空白
Transformer transformer=factory.newTransformer();
//设置格式
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "YES");
DOMSource xmlSource =new DOMSource(document);
StreamResult outputTarget =new StreamResult(new FileOutputStream("src/info.xml"));
transformer.transform(xmlSource, outputTarget);
}

/**
* 增加新手机节点
* @throws Exception
*/
public void add() throws Exception {
getDoc();
Element eleBrand=document.createElement("Brand");
eleBrand.setAttribute("name", "小米手机");
//获得根元素
Element root=(Element) document.getElementsByTagName("PhoneInfo").item(0);
root.appendChild(eleBrand);
save();
}

/**
* 修改
* @throws Exception
* @throws IOException
*/
public void change() throws IOException, Exception {
getDoc();
NodeList brands = document.getElementsByTagName("Brand");
for (int i = 0; i < brands.getLength(); i++) {
Node brandNode=brands.item(i);
Element eleBrand =(Element) brandNode;
String brandName = eleBrand.getAttribute("name");
if(brandName.equals("苹果")) {
eleBrand.setAttribute("name", "apple");
save();
}
}
}
/**
* 删除
* @throws Exception
* @throws IOException
*/
public void delate() throws Exception, Exception {
getDoc();
NodeList brands = document.getElementsByTagName("Brand");
for (int i = 0; i < brands.getLength(); i++) {
Node brandNode=brands.item(i);
Element eleBrand =(Element) brandNode;
String brandName = eleBrand.getAttribute("name");
if(brandName.equals("苹果")) {
eleBrand.getParentNode().removeChild(eleBrand);
save();
}
}
}

/**
* 显示
* @throws Exception
* @throws IOException
*/
public void show() throws IOException, Exception {
getDoc();
//获得brand节点
NodeList brands=document.getElementsByTagName("Brand");
for (int i = 0; i < brands.getLength(); i++) {
Node brandNode =brands.item(i);
Element eleBrand =(Element) brandNode;
System.out.println(eleBrand.getAttribute("name"));
//获得brand下的子节点
NodeList types=eleBrand.getChildNodes();
for (int j = 0; j < types.getLength(); j++) {
Node typeNode=types.item(j);
if(typeNode.getNodeType()==Node.ELEMENT_NODE) {
Element eleType = (Element) typeNode;
System.out.println("\t"+eleType.getAttribute("name"));
}
}

}
}

public static void main(String[] args) throws IOException, Exception {
Test1 t = new Test1();
t.show();
t.add();
t.change();
t.delate();
}
}

3、注意区别这几个关键词


Document:

可操作整个DOM树


Node

代表节点(节点又分为元素节点、文本节点),其中元素节点又叫标签节点,是带有尖括号的,换行在XML中也被认为是节点


Element

元素节点,是Node的一个子类


Atteabute

凡是对属性进行操作的


item

从NodeList中获得Node,要通过循环遍历

dom4j

1、方法:

百度dom4j,看官方帮助文档,里面会有一系列的方法。

1541405704330

2、显示xml信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Test1 {
public static void main(String[] args) throws Exception {
//获取domcument对象
SAXReader reader = new SAXReader();
Document doc =reader.read("src//info.xml");

//获取根元素
Element root =doc.getRootElement();

//循环遍历输出子节点
Iterator<Element> it=root.elementIterator();
while(it.hasNext()) {
Element brandEle = it.next();
String strBrand=brandEle.attributeValue("name");
Iterator<Element> it2=brandEle.elementIterator();
while(it2.hasNext()){
Element typeEle=it2.next();
String strType=typeEle.attributeValue("name");
System.out.println("品牌:"+strBrand+"\t"+"型号:"+strType);
}
}
}

}

3、保存xml文件

1
2
3
4
5
//保存
OutputFormat format =OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileWriter("src//info.xml"),format);
writer.write( doc );
writer.close();

4、添加信息

1
2
3
4
//添加
Element eleBrand = root.addElement("Brand");
eleBrand.addAttribute("name", "小米");
eleBrand.addText("这是小米手机");

5、修改&删除

1
2
3
4
5
6
7
8
9
10
11
12
13
// 修改
Iterator<Element> it = root.elementIterator();
while (it.hasNext()) {
Element brandEle = it.next();
Attribute att = brandEle.attribute("name");
if (att.getValue().equals("三星")) {
//修改
// att.setValue("sanxing");
//删除属性对象(包括属性名和属性值)
// brandEle.remove(att);
//删除整个brand三星
brandEle.getParent().remove(brandEle);
}

本文章已同步至我的GitHub仓库:Javastudy,期待您的加入:blush:

本文章已同步至苍何的个人博客,可以直接在博客上留言哦:blush:

来我的微信公众号玩耍呗:blush:

扫码无套路关注我的CSDN博客:blush:

苍 何 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!