参考:https://blog.csdn.net/p812438109/article/details/81807440
1、Document介绍。
答:API来源:在JDK中javax.xml.*包下。2、Document使用场景:
1)、需要知道XML文档所有结构。 2)、需要把文档一些元素排序。 3)、文档中的信息被多次使用的情况。
3、Document的优势和缺点:
1)、优势:由于Document是java中自带的解析器,兼容性强。 2)、缺点:由于Document是一次性加载文档信息,如果文档太大,加载耗时长,不太适用。
4、Document生成XML,步骤如下所示:
1 package com.demo.utils;
2
3 import java.io.File;
4
5 import javax.xml.parsers.DocumentBuilder;
6 import javax.xml.parsers.DocumentBuilderFactory;
7 import javax.xml.parsers.ParserConfigurationException;
8 import javax.xml.transform.OutputKeys;
9 import javax.xml.transform.Transformer;
10 import javax.xml.transform.TransformerConfigurationException;
11 import javax.xml.transform.TransformerException;
12 import javax.xml.transform.TransformerFactory;
13 import javax.xml.transform.dom.DOMSource;
14 import javax.xml.transform.stream.StreamResult;
15
16 import org.w3c.dom.Document;
17 import org.w3c.dom.Element;
18
19 /**
20 * Document生成XML
21 *
22 * @author
23 *
24 */
25 public class CreateDocument {
26
27 public static void main(String[] args) {
28 // 执行Document生成XML方法
29 createDocument(new File("E:\\person.xml"));
30 }
31
32 public static void createDocument(File file) {
33 try {
34 // 第一步:初始化一个XML解析工厂。
35 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
36
37 // 第二步:创建一个DocumentBuilder实例。
38 DocumentBuilder builder = factory.newDocumentBuilder();
39
40 // 第三步:构建一个Document实例。
41 Document doc = builder.newDocument();
42 // standalone用来表示该文件是否呼叫其它外部的文件。若值是 "yes"表示没有呼叫外部文件
43 doc.setXmlStandalone(true);
44
45 // 第四步:创建一个根节点,名称为root,并设置一些基本属性。
46 // 创建一个根节点
47 // 说明: doc.createElement("元素名")、
48 // element.setAttribute("属性名","属性值")、设置节点属性
49 // element.setTextContent("标签间的内容"),设置标签之间的内容
50 Element element = doc.createElement("root");
51 element.setAttribute("attr", "root");
52
53 // 创建根节点第一个子节点
54 Element elementChildOne = doc.createElement("userInfo");
55 elementChildOne.setAttribute("attr", "userInfo1");
56 element.appendChild(elementChildOne);
57
58 // 第一个子节点的第一个子节点
59 Element childOneOne = doc.createElement("zhangsansan");
60 childOneOne.setAttribute("attr", "userInfo1");
61 childOneOne.setTextContent("attr zhangsansan");
62 elementChildOne.appendChild(childOneOne);
63
64 // 第一个子节点的第二个子节点
65 Element childOneTwo = doc.createElement("lisisi");
66 childOneTwo.setAttribute("attr", "userInfo1");
67 childOneTwo.setTextContent("attr lisisi");
68 elementChildOne.appendChild(childOneTwo);
69
70 // 创建根节点第二个子节点
71 Element elementChildTwo = doc.createElement("userInfo");
72 elementChildTwo.setAttribute("attr", "userInfo2");
73 element.appendChild(elementChildTwo);
74
75 // 第二个子节点的第一个子节点
76 Element childTwoOne = doc.createElement("lisisi");
77 childTwoOne.setAttribute("attr", "userInfo2");
78 childTwoOne.setTextContent("attr lisisi");
79 elementChildTwo.appendChild(childTwoOne);
80
81 // 第二个子节点的第二个子节点
82 Element childTwoTwo = doc.createElement("wangwuwu");
83 childTwoTwo.setAttribute("attr", "userInfo2");
84 childTwoTwo.setTextContent("attr wangwuwu");
85 elementChildTwo.appendChild(childTwoTwo);
86
87 // 第五步:把节点添加到Document中,再创建一些子节点加入,添加根节点
88 doc.appendChild(element);
89
90 // 第六步:把构造的XML结构,写入到具体的文件中
91 // 把构造的XML结构,写入到具体的文件中
92 TransformerFactory formerFactory = TransformerFactory.newInstance();
93 Transformer transformer = formerFactory.newTransformer();
94 // 换行
95 transformer.setOutputProperty(OutputKeys.INDENT, "YES");
96 // 文档字符编码
97 transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
98
99 // 可随意指定文件的后缀,效果一样,但xml比较好解析,比如: E:\\person.txt等
100 transformer.transform(new DOMSource(doc), new StreamResult(file));
101
102 System.out.println("XML CreateDocument success!");
103 } catch (ParserConfigurationException e) {
104 e.printStackTrace();
105 } catch (TransformerConfigurationException e) {
106 e.printStackTrace();
107 } catch (TransformerException e) {
108 e.printStackTrace();
109 }
110 }
111
112 }
演示效果,如果是实际业务,可能要结合具体的业务进行分析,随时这东西,不常用吧,但是遇到了还是得会处理这种业务和需求的,如下所示:
5、Document解析XML,步骤如下所示:
1 package com.demo.utils;
2
3 import java.io.File;
4 import java.io.IOException;
5
6 import javax.xml.parsers.DocumentBuilder;
7 import javax.xml.parsers.DocumentBuilderFactory;
8 import javax.xml.parsers.ParserConfigurationException;
9
10 import org.w3c.dom.Attr;
11 import org.w3c.dom.Document;
12 import org.w3c.dom.Element;
13 import org.w3c.dom.NamedNodeMap;
14 import org.w3c.dom.Node;
15 import org.w3c.dom.NodeList;
16 import org.xml.sax.SAXException;
17
18 /**
19 *
20 * @author Document解析XML
21 *
22 */
23 public class ParseDocument {
24
25 public static void main(String[] args) {
26 File file = new File("E:\\person.xml");
27 if (!file.exists()) {
28 System.out.println("xml文件不存在,请确认!");
29 } else {
30 // 第一步:先获取需要解析的文件,判断文件是否已经存在或有效
31 parseDocument(file);
32 }
33 }
34
35 public static void parseDocument(File file) {
36 try {
37 // 第二步:初始化一个XML解析工厂
38 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
39
40 // 第三步:创建一个DocumentBuilder实例
41 DocumentBuilder builder = factory.newDocumentBuilder();
42
43 // 第四步:创建一个解析XML的Document实例
44 Document doc = builder.parse(file);
45
46 // 第五步:先获取根节点的信息,然后根据根节点递归一层层解析XML
47 // 获取根节点名称
48 String rootName = doc.getDocumentElement().getTagName();
49 System.out.println("根节点: " + rootName);
50
51 System.out.println("递归解析--------------begin------------------");
52 // 递归解析Element
53 Element element = doc.getDocumentElement();
54 parseElement(element);
55 System.out.println("递归解析--------------end------------------");
56 } catch (ParserConfigurationException e) {
57 e.printStackTrace();
58 } catch (SAXException e) {
59 e.printStackTrace();
60 } catch (IOException e) {
61 e.printStackTrace();
62 }
63 }
64
65 // 递归方法
66 public static void parseElement(Element element) {
67 System.out.print("<" + element.getTagName());
68 NamedNodeMap attris = element.getAttributes();
69 for (int i = 0; i < attris.getLength(); i++) {
70 Attr attr = (Attr) attris.item(i);
71 System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\"");
72 }
73 System.out.println(">");
74
75 NodeList nodeList = element.getChildNodes();
76 Node childNode;
77 for (int temp = 0; temp < nodeList.getLength(); temp++) {
78 childNode = nodeList.item(temp);
79
80 // 判断是否属于节点
81 if (childNode.getNodeType() == Node.ELEMENT_NODE) {
82 // 判断是否还有子节点
83 if (childNode.hasChildNodes()) {
84 parseElement((Element) childNode);
85 } else if (childNode.getNodeType() != Node.COMMENT_NODE) {
86 System.out.print(childNode.getTextContent());
87 }
88 }
89 }
90 System.out.println("" + element.getTagName() + ">");
91 }
92
93 }
解析效果,如下所示:
1 根节点: root
2 递归解析--------------begin------------------
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 递归解析--------------end------------------
!