1. XML概述
和HTML是同宗
XML 可扩展标记语言
Xml文件标签可以进行自定义 对大小写敏感 主要用于存储数据
Xml文件的第一行
<?xml version="1.0" encoding="UTF-8"?>
语法:
- 双标签 xml文件语法格式比较严格 有开必有关
- 大小写敏感
<department> ----Element ---Tag 标签节点
Id=”110” ----Attribute 属性节点
张三疯 ----Text 文本节点
2.xml文件解析方式
DOM SAX DOM4J JDOM XPATH
DOM document Object Model 文档对象模型 ----Js
SAX 事件模型
DOM4J -------需要依赖第三方jar包
Xpath -----android python 领域应用偏多
DOM解析方式:
把整个文档看成是一个倒挂的树形结构来进行解析
Root ---根节点
Document 接口 -----必有实现类 相当于把整个的文档读取在内存中 (变量)
JavaAPI ---- org.w3c.dom
Document 接口 表示的html或xml文件文档对象
Document的父接口是Node
Node 是所有节点的父接口
Element、Text 、Attribute Document -----父接口都是Node
package com.openlab.xmlparse;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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 Test {
// Document 对象
public static void main(String[] args) {
try {
// 1. 单例模式 获取document解析工厂对象
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
// 2.通过文档解析工厂对象 去获取解析对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 3.通过文档解析器获取文档对象
Document doc = builder.parse("department.xml");
// 获取根节点
Element root = doc.getDocumentElement();
// // 获取student节点
// Node student = root.getFirstChild().getNextSibling();
// // 获取name的节点
// Node name = student.getFirstChild().getNextSibling();
//
//
// //getNodeName 返回节点名称
// //getTextContent 返回节点的文本
// //getNodeValue 返回节点的值
// //一般的element ---value --null
// // text ----name 都是#text
// // Attribute name ---id value ----110
// System.out.println(name.getNodeName());
// System.out.println(name.getTextContent());
//
// Node age = name.getNextSibling().getNextSibling();
//
// System.out.println(age.getNodeName());
// System.out.println(age.getTextContent());
// 能不能写一个通用的遍历方法
NodeList list = doc.getElementsByTagName("student");
System.out.println(list.getLength());
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.openlab.xmlparse;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
public class XMLUtils {
/**
* 构造方法私有化
*/
private XMLUtils() {
// TODO Auto-generated constructor stub
}
/**
* 获取document对象
* @param xmlfile
* @return
* @throws ParserConfigurationException
* @throws SAXException
* @throws IOException
*/
public static Document getDocumentInstance(String xmlfile) throws ParserConfigurationException, SAXException, IOException{
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(xmlfile);
return doc;
}
/**
* 对文档进行遍历的通用方法
* @param start
*/
public static void visit(Node start){
System.out.println(start.getNodeName()+"..."+start.getNodeValue());
// 确保传递的节点对象是Element
// 因为Attribute 一定在Element中
if(start.getNodeType() == Node.ELEMENT_NODE){
NamedNodeMap nnm = start.getAttributes();
// 处理属性节点对象
for (int i = 0; i < nnm.getLength(); i++) {
Node attr = nnm.item(i);
System.out.println(attr.getNodeName()+"...."+attr.getNodeValue());
}
for(Node sub = start.getFirstChild();sub!=null;sub = sub.getNextSibling()){
visit(sub);
}
}
}
}
3.XML添加操作
5.package com.openlab.xmlparse;
6.
7.import java.io.IOException;
8.
9.import javax.xml.parsers.ParserConfigurationException;
10.import javax.xml.transform.Transformer;
11.import javax.xml.transform.TransformerConfigurationException;
12.import javax.xml.transform.TransformerException;
13.import javax.xml.transform.TransformerFactory;
14.import javax.xml.transform.dom.DOMSource;
15.import javax.xml.transform.stream.StreamResult;
16.
17.import org.w3c.dom.Document;
18.import org.w3c.dom.Element;
19.import org.w3c.dom.Node;
20.import org.w3c.dom.Text;
21.import org.xml.sax.SAXException;
22.
23.public class XMLaddTest {
24.
25. public static void main(String[] args) {
26.
27. try {
28. // 获取document对象
29. Document doc = XMLUtils.getDocumentInstance("department.xml");
30. //创建element
31. Element sex = doc.createElement("sex");
32. //创建text
33. Text sexText = doc.createTextNode("男");
34. //把text添加为 element的节点
35. Node sexNode = sex.appendChild(sexText);
36.
37.// System.out.println(sex.getNodeName()+"..."+sex.getTextContent());
38. // 插入到文档中去 insert
39. Node root = doc.getDocumentElement();
40.
41. Node stuNode = root.getFirstChild().getNextSibling();
42.
43. stuNode.insertBefore(sex, stuNode.getFirstChild());
44.
45. // 添加节点 在内存对象document中成功
46. XMLUtils.visit(root);
47.
48. //把内存中的添加的内容最终输出到持久化的文档中
49.
50.
51. TransformerFactory factory = TransformerFactory.newInstance();
52.
53. Transformer former = factory.newTransformer();
54. //Source 源 Result 结果
55.
56. DOMSource ds = new DOMSource(doc);
57.
58. StreamResult stream = new StreamResult("department.xml");
59.
60. former.transform(ds, stream);
61.
62.
63.
64.
65.
66.
67. } catch (ParserConfigurationException | SAXException | IOException e) {
68. // TODO Auto-generated catch block
69. e.printStackTrace();
70. } catch (TransformerConfigurationException e) {
71. // TODO Auto-generated catch block
72. e.printStackTrace();
73. } catch (TransformerException e) {
74. // TODO Auto-generated catch block
75. e.printStackTrace();
76. }
77.
78. }
79.
80.}
81.
4.XML修改和删除操作
SetNodeValue
SetTextContent
RemoveChild()
以上方法的应用,注意在删除节点时 要在父节点的位置上删除子节点。