DOM方式:
package DomTest import java.io.File import java.io.IOException 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.NamedNodeMap import org.w3c.dom.Node import org.w3c.dom.NodeList import org.xml.sax.SAXException public class DOMTest { public void creatXML(){
DocumentBuilder db=getDocumentBuilder() Document document=db.newDocument() document.setXmlStandalone(true) //创建根节点
Element bookstore= document.createElement("bookStore") //添加子节点book
Element book=document.createElement("book") //添加子节点name
Element name=document.createElement("name") book.appendChild(name) //添加子节点内容
name.setTextContent("人猿泰山") book.setAttribute("id", "1") //将book子节点添加到bookstore中
bookstore.appendChild(book) //将bookstore节点(已包含book)添加到dom数中
document.appendChild(bookstore) //
TransformerFactory tff=TransformerFactory.newInstance() try {
Transformer tf=tff.newTransformer() //让DOM树输出过程中正常换行
tf.setOutputProperty(OutputKeys.INDENT, "yes") tf.transform(new DOMSource(document), new StreamResult(new File("books1.xml"))) } catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace() }
}
public static DocumentBuilder getDocumentBuilder(){
// 创建一个DocumentBuilderFactory对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance() // 创建DocumentBuilder对象
DocumentBuilder db=null try {
db = dbf.newDocumentBuilder() } catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace() }
return db }
public static void main(String[] args) {
// 创建一个DocumentBuilder的对象
try {
// 通过DocumentBuilder对象的parse方法加载books.xml文件
// 到当前项目下
Document document = getDocumentBuilder().parse("books.xml") // 获取所有book节点的集合
NodeList bookList = document.getElementsByTagName("book") //通过nodeList的getLength()方法获取bookLIst的长度
System.out.println("一共有:"+bookList.getLength()+"本书") //便利各个book节点
for (int i = 0 System.out.println("++++++++++++开始遍历第"+(i+1)+"本书+++++++++++") //方式一,不知道有多少节点,通过循环来遍历所有节点。
//通过 item(i)获取一个book节点,nodeList
Node book=bookList.item(i) //获取book的属性的集合
NamedNodeMap attrs=book.getAttributes() System.out.println("第"+(i+1)+"本书共有"+attrs.getLength()+"个属性") //便利book的属性
for (int j = 0 //通过item()方法获取book节点的某一个属性
Node attr=attrs.item(j) //获取属性名
System.out.println("属性名:"+attr.getNodeName()) //获取属性值
System.out.println("属性值:"+attr.getNodeValue()) }
// //方式二,知道有且只有一个节点。并且知道属性的名称为“id”
// //强制类型转换将book节点类型转换为Element类型
// Element book =(Element) bookList.item(i) //
// //通过getAttribute(“id”)方法获取到属性的值
// String attrValue=book.getAttribute("id") // System.out.println("id的属性的属性值为"+attrValue) //解析book节点的子节点,需要用到方式一中创建的book对象
//获取子节点的集合
NodeList childNodes=book.getChildNodes() //遍历childNodes获取每个子节点的节点名和节点值
System.out.println("第"+(i+1)+"本书共有"+childNodes.getLength()+"个子节点") //循环遍历
for (int j = 0 //区分text类型的node和element类型的node
if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){
//输出了element类型节点的节点名
System.out.println("第"+(j+1)+"个节点名:"+childNodes.item(j).getNodeName()) //输出element类型节点的节点值
//需先获取当前节点的首个子节点,否则获取的是《name》标签的值NULL
//方式一:如果<name>节点下有多个子节点,此方法只输出确定的某个子节点的值
//同样要注意,<name>节点的第一个子节点的值是第一子节点的类型的值,还是NULL
System.out.println("节点值为:"+childNodes.item(j).getFirstChild() .getNodeValue()) //方式二:如果<name>节点下有多个子节点,此方法输出所有子节点的text
System.out.println(childNodes.item(j).getTextContent()) }
}
System.out.println("++++++++++++结束遍历第"+(i+1)+"本书++++++++++++") }
} catch (SAXException e) {
e.printStackTrace() } catch (IOException e) {
e.printStackTrace() }
DOMTest test=new DOMTest() test.creatXML() }
}
-
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
-
146
-
147
-
148
-
149
-
150
-
151
-
152
-
153
-
154
-
155
-
156
-
157
-
158
-
159
-
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
-
146
-
147
-
148
-
149
-
150
-
151
-
152
-
153
-
154
-
155
-
156
-
157
-
158
-
159
SAX方式:
使用SAX解析时创建的SAXParserHandler.Java
package test import java.io.File import java.io.FileNotFoundException import java.io.FileOutputStream import java.io.IOException import java.util.ArrayList import javax.xml.parsers.ParserConfigurationException import javax.xml.parsers.SAXParser import javax.xml.parsers.SAXParserFactory import javax.xml.transform.OutputKeys import javax.xml.transform.Result import javax.xml.transform.Transformer import javax.xml.transform.TransformerConfigurationException import javax.xml.transform.sax.SAXTransformerFactory import javax.xml.transform.sax.TransformerHandler import javax.xml.transform.stream.StreamResult import org.xml.sax.SAXException import org.xml.sax.helpers.AttributesImpl import test2.SAXParserHandler import test3.Book public class SAXTest {
public ArrayList<Book> parseXML(){
// 通过SAXParseFactory的静态newInstance()
//方法获取SAXParseFactory实例factory
SAXParserFactory factory=SAXParserFactory.newInstance() SAXParserHandler handler=null //通过SAXParserFactory实例的newSAXParser()
//方法返回SAXParse实例parser
try {
SAXParser parser= factory.newSAXParser() //创建SAXParserHandler对象
handler=new SAXParserHandler() parser.parse("books.xml", handler) System.out.println("书的数量:"+handler.getBookList().size()) for(Book book: handler.getBookList()){
System.out.println(book.getId()) System.out.println(book.getName()) System.out.println(book.getAuthor()) System.out.println(book.getPrice()) System.out.println(book.getYear()) System.out.println("-------------") }
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace() } catch (ParserConfigurationException | SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace() }
return handler.getBookList() }
public void createXML(){
ArrayList<Book> bookList=parseXML() //生成XML
//1、创建一个TransformFacroty对象
SAXTransformerFactory tff=(SAXTransformerFactory)
SAXTransformerFactory.newInstance() try {
//2、通过SAXTransformerFactory对象创建一个TransformerHandler对象
TransformerHandler handler=tff.newTransformerHandler() //3、通过handler对象创建一个Transformer对象
Transformer tr=handler.getTransformer() //4、通过Transformer对象对生成的XML文件进行设置
//设置XML编码
tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8") //设置换行
tr.setOutputProperty(OutputKeys.INDENT, "yes") //5、创建一个Result对象
File f=new File("src/newbooks.xml") if(!f.exists()){
f.createNewFile() }
Result result=new StreamResult(new FileOutputStream(f)) //6、创建result对象并使其与handler关联
handler.setResult(result) //7、使用handler对象进行XML文件的编写
//打开document
handler.startDocument() AttributesImpl attr=new AttributesImpl() //开始标签
handler.startElement("", "", "bookstore", attr) for(Book book:bookList){
attr.clear() attr.addAttribute("", "", "id", "", book.getId()) handler.startElement("", "", "book", attr) attr.clear() //创建name节点
handler.startElement("", "", "name", attr) handler.characters(book.getName().toCharArray(), 0, book.getName().length()) handler.endElement("", "", "name") //创建author节点
attr.clear() handler.startElement("", "", "author", attr) handler.characters(book.getAuthor().toCharArray(), 0, book.getAuthor().length()) handler.endElement("", "", "author") //创建price节点
attr.clear() handler.startElement("", "", "price", attr) handler.characters(book.getPrice().toCharArray(), 0, book.getPrice().length()) handler.endElement("", "", "price") //创建year节点
//判断当有此节点时才进行创建操作
if(book.getYear()!=null&&!book.getYear().trim().equals("")){
attr.clear() handler.startElement("", "", "year", attr) handler.characters(book.getYear().toCharArray(), 0, book.getYear().length()) handler.endElement("", "", "year") }
handler.endElement("", "", "book") }
//结束标签
handler.endElement("", "", "bookstore") //关闭document
handler.endDocument() } catch (TransformerConfigurationException | IOException | SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace() }
}
public static void main(String[] args) {
SAXTest test=new SAXTest() test.createXML() }
}
-
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
-
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
DOM4J方式:
RSS就是一个特殊格式的XML
package Dom4jTest import java.io.File import java.io.FileNotFoundException import java.io.FileOutputStream import java.io.IOException import java.io.UnsupportedEncodingException import java.util.Iterator import java.util.List import org.dom4j.Attribute import org.dom4j.Document import org.dom4j.DocumentException import org.dom4j.DocumentHelper import org.dom4j.Element import org.dom4j.io.OutputFormat import org.dom4j.io.SAXReader import org.dom4j.io.XMLWriter public class DOM4JTest {
public static void main(String[] args) {
new DOM4JTest().createXML() }
public void parseXML() {
// TODO Auto-generated method stub
// 创建SAXReader对象
SAXReader reader = new SAXReader() // 通过reader对象read 方法加载book.xml try {
Document document = reader.read(new File("src/res/books.xml")) // 通过document对象获取根节点bookstore
Element bookStore = document.getRootElement() // 通过element对象的elementIterator方法获取迭代器
Iterator it = bookStore.elementIterator() // 遍历迭代器,获取根节点中的信息
while (it.hasNext()) {
System.out.println("开始遍历一本书") Element book = (Element) it.next() // 获取book的属性名和属性值
List<Attribute> bookAttrs = book.attributes() for (Attribute attr : bookAttrs) {
System.out.println("属性名:" + attr.getName() + "\t属性值:" + attr.getValue()) }
Iterator itt = book.elementIterator() while (itt.hasNext()) {
Element bookChild = (Element) itt.next() System.out.println("节点名:" + bookChild.getName() + "\t节点值:" + bookChild.getStringValue()) }
System.out.println("结束遍历一本书" + "\n") }
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace() }
}
public void createXML(){
//1、创建Document对象,代表整个XML
Document document=DocumentHelper.createDocument() //2、创建根节点
Element rss=document.addElement("rss") //3、向rss节点中添加version属性
rss.addAttribute("version", "2.0") //4、生成子节点及内容
Element channel=rss.addElement("channel") Element title=channel.addElement("title") title.setText("新闻资讯") //设置换行
OutputFormat format=OutputFormat.createPrettyPrint() format.setEncoding("UTF-8") //5、生成XML文件
File file=new File("rssnews.xml") XMLWriter writer try {
writer = new XMLWriter(new FileOutputStream(file),format) //设置是否转义,默认是true进行转义
writer.setEscapeText(false) writer.write(document) writer.close() } catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace() } catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace() }catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace() }
}
}
-
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
-
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
JDOM方式:
package test import java.util.ArrayList import java.util.List import java.io.File import java.io.FileInputStream import java.io.FileNotFoundException import java.io.FileOutputStream import java.io.IOException import java.io.InputStream import java.io.InputStreamReader import org.jdom2.Attribute import org.jdom2.Document import org.jdom2.Element import org.jdom2.JDOMException import org.jdom2.input.SAXBuilder import org.jdom2.output.Format import org.jdom2.output.XMLOutputter import test3.Book public class JDOMTest {
private static ArrayList<Book> booksList = new ArrayList<Book>() public static void main(String[] args) {
new JDOMTest().createXML() }
public void parserXML() {
// JDOM解析XML文件
// 创建一个SAXBuilder对象
SAXBuilder saxbuilder = new SAXBuilder() InputStream in try {
// 创建一个输入流,将xml文件加载到流中 in = new FileInputStream("src/res/books.xml") // InputStreamReader ins=new InputStreamReader(in,"UTF-8") // 通过saxbuilder的build方法将输入流加载到saxbuilder中
Document document = saxbuilder.build(in) // 通过document对象获取xml文件的根节点
Element rootElement = document.getRootElement() // 获取根节点下的子节点的集合
List<Element> bookList = rootElement.getChildren() // 使用foreach循环解析
for (Element book : bookList) {
Book bookEntity = new Book() System.out.println("开始解析第" + (bookList.indexOf(book) + 1) + "本书============") // 解析book的属性
List<Attribute> attrList = book.getAttributes() // //知道节点属性名
// book.getAttribute("id") // 针对不清楚book节点下属性名和数量的情况
// 遍历attrList
for (Attribute attr : attrList) {
// 获取属性名和属性值
String attrName = attr.getName() String attrValue = attr.getValue() System.out.println("属性名:" + attrName + "\t属性值:" + attrValue) // 存储book节点
if (attrName.equals("id")) {
bookEntity.setId(attrValue) }
}
// 对book节点的子节点的节点名和节点值进行遍历
List<Element> bookChilds = book.getChildren() for (Element child : bookChilds) {
System.out.println("节点名:" + child.getName() + "\t节点值:" + child.getValue()) // 存储子节点名
if (child.getName().equals("name")) {
bookEntity.setName(child.getValue()) } else if (child.getName().equals("author")) {
bookEntity.setAuthor(child.getValue()) } else if (child.getName().equals("year")) {
bookEntity.setYear(child.getValue()) } else if (child.getName().equals("price")) {
bookEntity.setPrice(child.getValue()) }
}
System.out.println("结束解析第" + (bookList.indexOf(book) + 1) + "本书============") // 添加booksList集合对象
booksList.add(bookEntity) bookEntity = null System.out.println(booksList.size()) System.out.println(booksList.get(0).getId()) System.out.println(booksList.get(0).getName()) }
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace() } catch (JDOMException e) {
// TODO Auto-generated catch block
e.printStackTrace() } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace() }
}
public void createXML(){
//1、生成一个根节点
Element rss=new Element("rss") rss.setAttribute("version","2.0") //2、生成一个document对象
Document document=new Document(rss) Element channel=new Element("channel") rss.addContent(channel) Element title=new Element("title") title.setText("ceshiceshi测试") channel.addContent(title) Format format=Format.getCompactFormat() format.setIndent("") format.setEncoding("GBK") //创建XMLOutputter对象
XMLOutputter outputer=new XMLOutputter(format) try {
outputer.output(document, new FileOutputStream(new File("rssnews"))) } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace() } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace() }
}
}
-
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
-
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
生成方式对比
DOM 基于树结构,始终在内存中,方便增删改操作
SAX基于事件
JDOM 基于底层API
DOM4J基于底层API
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31088174/viewspace-2116288/
,如需转载,请注明出处,否则将追究法律责任。