喵星之旅-成长的雏鹰-java高级特性-6-xml

XML简介

XML(EXtensible Markup Language),可扩展标记语言.
特点
1、XML与操作系统、编程语言的开发平台无关
2、实现不同系统之间的数据交换

作用
1、数据交互
2、配置应用程序和网站
3、Ajax基石

XML文档结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<books>
<!--图书信息 -->
<book id="bk101">
<author>王珊</author>
<title>.NET高级编程</title>
<description>包含C#框架和网络编程等</description>
</book>
<book id="bk102">
<author>李明明</author>
<title>XML基础编程</title>
<description>包含XML基础概念和基本作用</description>
</book>
</books>

第一行是声明,后面是文档元素描述信息(文档结构)。

XML标签

XML文档内容由一系列标签元素组成。

1
2
3
4
5
6
7
<元素名 属性名=“属性值”>元素内容</元素名>

空元素:
<name> </name>
<name></name>
<name/>

1
2
3
4
5
属性值用双引号包裹
一个元素可以有多个属性
属性值中不能直接包含<、“、&
不建议使用的字符:‘、>

XML编写注意事项

所有XML元素都必须有结束标签
XML标签对大小写敏感
XML必须正确的嵌套
同级标签以缩进对齐
元素名称可以包含字母、数字或其他的字符
元素名称不能以数字或者标点符号开始
元素名称中不能含空格

样例

将如下衣服的尺码信息,使用XML文件保存

1
2
3
4
5
6
衣服型号    对应身高
S 身高<165
M 165<身高<170
L 170<身高<175
XL 175<身高<180
XXL 180<身高<185
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<clothesSize>
<size range="height&lt;165">S</size>
<size range="165&lt;height&lt;170">M</size>
<size range="110&lt;height&lt;175">L</size>
<size range="175&lt;height&lt;180">XL</size>
<size range="180&lt;height&lt;185">XXL</size>
</clothesSize>

XML命名空间

XML命名空间的作用:
解决在复杂、大型XML文件中,出现名称相同,但是含义不同的元素。

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<cameras xmlns:canon="http://www.canon"
xmlns:nikon="http://www.nikon.com">
<canon:camera prodID="P663" name="Camera傻瓜相机"/>
<nikon:camera prodID=“K29B3” name=“Camera超级35毫米相机"/>
</cameras>

解析XML技术

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DOM
基于XML文档树结构的解析
适用于多次访问的XML文档
特点:比较消耗资源

SAX
基于事件的解析
适用于大数据量的XML文档
特点:占用资源少,内存消耗小
DOM4J

非常优秀的Java XML API
性能优异、功能强大
开放源代码

DOM解析XML

DOM介绍:文档对象模型(Document Object Model),DOM把XML文档映射成一个倒挂的树。

常用接口介绍

1、Document:表示整个 XML 文档
NodeList getElementsByTagName(String Tag) 按文档顺序返回文档中指定标记名称的所有元素集合
Element createElement(String tagName) 创建指定标记名称的元素

2、Node:该文档树中的单个节点
NodeList getChildNodes() 获取该元素的所有子节点,返回节点集合

3、Element:XML 文档中的一个元素
String getTagName() 获取元素名称

样例

访问DOM树节点

DOM解析XML文件步骤
1.创建解析器工厂对象
2.解析器工厂对象创建解析器对象
3.解析器对象指定XML文件创建Document对象
4.以Document对象为起点操作DOM树

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
138
139
140
141
142
143
144
145
<?xml version="1.0" encoding="GB2312"?>
<PhoneInfo>
<Brand name="华为">
<Type name="U8650"/>
<Type name="HW123"/>
<Type name="HW321"/>
</Brand>
<Brand name="苹果">
<Type name="iPhone4"/>
</Brand>
</PhoneInfo>


import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
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;
import org.xml.sax.SAXException;


public class ParseXMLDemo {
private Document document=null;
public static void main(String[] args) {
ParseXMLDemo pd=new ParseXMLDemo();
pd.getDocument();
pd.showInfo();
// pd.add();
// pd.update();
// pd.savaXML("new.xml");
// pd.delete();
}

public void getDocument(){
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder=factory.newDocumentBuilder();
document=builder.parse("收藏信息.xml");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}


//获取手机品牌和属性
public void showInfo(){
NodeList brands=document.getElementsByTagName("Brand");
for(int i=0;i<brands.getLength();i++){
Node node=brands.item(i);
Element eleBrand=(Element)node;
System.out.println(eleBrand.getAttribute("name"));

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(eleType.getAttribute("name"));
}
}
}
}

//保存XML文件
public void savaXML(String path){
TransformerFactory factory=TransformerFactory.newInstance();
factory.setAttribute("indent-number", "4");
try {
Transformer transformer=factory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
// StreamResult result=new StreamResult(new FileOutputStream(path));
StreamResult result=new StreamResult(new OutputStreamWriter(new FileOutputStream(path), "gb2312"));
DOMSource source=new DOMSource(document);
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

//添加
public void add(){
Element element=document.createElement("Brand");
element.setAttribute("name", "三星");
Element ele1=document.createElement("Type");
ele1.setAttribute("name", "Note3");
element.appendChild(ele1);
document.getElementsByTagName("PhoneInfo").item(0).appendChild(element);
this.savaXML("new.xml");
}

//修改
public void update(){
NodeList brands=document.getElementsByTagName("Brand");
for(int i=0;i<brands.getLength();i++){
Node brand=brands.item(i);
Element eleBrand=(Element)brand;
eleBrand.setAttribute("id", i+"");
}
this.savaXML("new.xml");
}

//删除
public void delete(){
NodeList brands=document.getElementsByTagName("Brand");
for(int i=0;i<brands.getLength();i++){
Node brand=brands.item(i);
Element eleBrand=(Element)brand;
if(eleBrand.getAttribute("name").equals("华为")){
eleBrand.getParentNode().removeChild(eleBrand);
}
}
this.savaXML("new.xml");
}
}

文章目录
  1. XML简介
    1. XML文档结构
    2. XML标签
    3. XML编写注意事项
    4. 样例
    5. XML命名空间
    6. 解析XML技术
  2. DOM解析XML
    1. 常用接口介绍
    2. 样例
|