java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.setXmlVersion问题解决方法

时间:2022-05-07 22:55:11

读取本地的xml文件,通过DOM进行解析,DOM解析的特点就是把整个xml文件装载入内存中,形成一颗DOM树形结构,树结构是方便遍历和和操纵。

DOM解析的特性就是读取xml文件转换为 dom树形结构,通过节点进行遍历。

这是W3c关于节点的概念

如果xml中包含有大量的数据,由于dom一次性把xml装入内存中的特性,所以dom不适合于包含大量数据的xml解析。当包含有大量xml的时候,用SAX进行解析比较节省内存。

下面是一个运用DOM进行解析xml文件的例子:

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
25
26
27
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
 <book category="cooking">
 <title lang="en">Everyday Italian</title>
 <author>Giada De Laurentiis</author>
 <year>2005</year>
 <price>30.00</price>
 </book>
 <book category="children">
 <title lang="en">Harry Potter</title>
 <author>J K. Rowling</author>
 <year>2005</year>
 <price>29.99</price>
 </book>
 <book category="web">
 <title lang="en">XQuery Kick Start</title>
 <author>James McGovern</author>
 <year>2003</year>
 <price>49.99</price>
 </book>
 <book category="web" cover="paperback">
 <title lang="en">Learning XML</title>
 <author>Erik T. Ray</author>
 <year>2003</year>
 <price>39.95</price>
 </book>
</bookstore>

创建解析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
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
package xml.dom;
 
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
 
public class ReadXmlFile {
 
 public static void main(String[] args) {
 
 try{
  
  File xmlFile = new File("src/resource/book.xml");
  
  DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
  
  DocumentBuilder builder = builderFactory.newDocumentBuilder();
  
  Document doc = builder.parse(xmlFile);
  
  doc.getDocumentElement().normalize();
  
  System.out.println("Root element: "+doc.getDocumentElement().getNodeName());
  
  NodeList nList = doc.getElementsByTagName("book");
  
  for(int i = 0 ; i<nList.getLength();i++){
  
  Node node = nList.item(i);
  
  System.out.println("Node name: "+ node.getNodeName());
  Element ele = (Element)node;
  
  System.out.println("----------------------------");
  if(node.getNodeType() == Element.ELEMENT_NODE){
  
  System.out.println("book category: "+ ele.getAttribute("category"));
  
  System.out.println("title name: "+ ele.getElementsByTagName("title").item(0).getTextContent());
  
  System.out.println("author name: "+ele.getElementsByTagName("author").item(0).getTextContent());
  
  System.out.println("year :"+ele.getElementsByTagName("year").item(0).getTextContent());
  
  System.out.println("price : "+ele.getElementsByTagName("price").item(0).getTextContent());
  
  System.out.println("-------------------------");
  
  
  }
  
  
  }
 

解析结果:

?
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
Root element: bookstore
Node name: book
----------------------------
book category: cooking
title name: Everyday Italian
author name: Giada De Laurentiis
year :2005
price : 30.00
-------------------------
Node name: book
----------------------------
book category: children
title name: Harry Potter
author name: J K. Rowling
year :2005
price : 29.99
-------------------------
Node name: book
----------------------------
book category: web
title name: XQuery Kick Start
author name: James McGovern
year :2003
price : 49.99
-------------------------
Node name: book
----------------------------
book category: web
title name: Learning XML
author name: Erik T. Ray
year :2003
price : 39.95
-------------------------


以上是通过name获得对应的值,
下面利用循环节点的方式输出:
循环节点输出方式的代码如下:

?
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
package xml.dom;
 
import java.io.File;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
 
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
 
public class ReadXmlFile2 {
 
 public static void main(String[] args) {
 try{
  
  File xmlFile = new File("src/resource/book.xml");
  
  DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
  
  DocumentBuilder builder = builderFactory.newDocumentBuilder();
  
  Document doc = builder.parse(xmlFile);
  
  doc.getDocumentElement().normalize();
  
  System.out.println("Root element: "+doc.getDocumentElement().getNodeName());
  
  
  if(doc.hasChildNodes()){
  
  printNode(doc.getChildNodes());
  }
 }catch(Exception e){
 
 e.printStackTrace();
 
 }
 
 }
 
 public static void printNode(NodeList nodeList){
 System.out.println("------------------------");
 // System.out.println(nodeList.getLength());
 for(int i = 0; i<nodeList.getLength(); i++){
 
 Node node = (Node)nodeList.item(i);
 
 
 if(node.getNodeType() == Node.ELEMENT_NODE){
 
 System.out.println("node name: "+node.getNodeName());
 
 System.out.println("node value: "+node.getTextContent());
 
 if(node.hasAttributes()){
  NamedNodeMap nodeMap = node.getAttributes();
  
  for(int j = 0; j < nodeMap.getLength() ; j++){
  
  Node nodenew = nodeMap.item(j);
  
  System.out.println("node name "+nodenew.getNodeName());
  System.out.println("node value "+nodenew.getNodeValue());
  }
 }
 if(node.hasChildNodes()){
  printNode(node.getChildNodes());
 }
 }
 
 }
 
 }
 
}

输出结果如下:

 

?
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
Root element: bookstore
------------------------
node name: bookstore
node value:
 
 Everyday Italian
 Giada De Laurentiis
 2005
 30.00
 
 
 Harry Potter
 J K. Rowling
 2005
 29.99
 
 
 XQuery Kick Start
 James McGovern
 2003
 49.99
 
 
 Learning XML
 Erik T. Ray
 2003
 39.95
 
 
------------------------
node name: book
node value:
 Everyday Italian
 Giada De Laurentiis
 2005
 30.00
 
node name category
node value cooking
------------------------
node name: title
node value: Everyday Italian
node name lang
node value en
------------------------
node name: author
node value: Giada De Laurentiis
------------------------
node name: year
node value: 2005
------------------------
node name: price
node value: 30.00
------------------------
node name: book
node value:
 Harry Potter
 J K. Rowling
 2005
 29.99
 
node name category
node value children
------------------------
node name: title
node value: Harry Potter
node name lang
node value en
------------------------
node name: author
node value: J K. Rowling
------------------------
node name: year
node value: 2005
------------------------
node name: price
node value: 29.99
------------------------
node name: book
node value:
 XQuery Kick Start
 James McGovern
 2003
 49.99
 
node name category
node value web
------------------------
node name: title
node value: XQuery Kick Start
node name lang
node value en
------------------------
node name: author
node value: James McGovern
------------------------
node name: year
node value: 2003
------------------------
node name: price
node value: 49.99
------------------------
node name: book
node value:
 Learning XML
 Erik T. Ray
 2003
 39.95
 
node name category
node value web
node name cover
node value paperback
------------------------
node name: title
node value: Learning XML
node name lang
node value en
------------------------
node name: author
node value: Erik T. Ray
------------------------
node name: year
node value: 2003
------------------------
node name: price
node value: 39.95
------------------------

 

关于节点的问题:

?
1
2
3
4
5
6
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>

对于 book应用:doc.getChildNodes() 得到一个NodeList其中NodeList的长度为9
9个节点分别如下:
title节点
lang节点 
Everyday节点
 author节点
Giada De Laurentiis节点
 year节点
 2005节点
 price节点
 30.00节点