来源:http://www.cnblogs.com/jimmyqwy/archive/2010/07/10/1774934.html
最近稍微接触了下用Java Dom 解析XML的文件。
遇到两个小问题,就在这里做个笔记吧~
1. Node 的 getNodeValue方法返回的一直是null。
其实还是由于对这个类不熟悉的关系,导致了这个问题。
Node有很多类型,一般<html> </html> 这种类型叫做Element Node。
需要得到其中的文本,直接使用getNodeValue方法是行不通的。
因为此Node中包含的文本其实是属于另外一种Node类型,即 Text Node。
所以此文本对应的Node,是上述<html> Element Node的子节点。
解决方法:如同网上各处所说的
.getFirstChild().getNodeValue(); (第一个子节点的Value值)
至于为啥Element Node的Node Value是null值,
参照JavaDoc可知,其定义就是如此。详细参照如下:
http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/org/w3c/dom/Node.html
2. 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
File f = new File( save_filename ); // 需要保存的名字
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
try {
builder = factory.newDocumentBuilder();
// createing a new DOM-document...
Document document = builder.newDocument(); // 1)
Element saveRoot = document.createElement("Root");
document.appendChild(saveRoot); // 2)
saveTree( saveRoot, document ); // 添加各种节点,建立DOM树
// Use a Transformer for output
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.setOutputProperty("indent", "yes"); // 3)
// transform DOM 2 XML file // 4)
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult( f );
transformer.transform(source, result);
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
其中使用到的
DocumentBuilderFactory / DocumentBuilder / TransformerFactory / DOMSource / StreamResult
意如其名,不用多解释了。
Question
1)全新 Document 的建立方式。
也可以使用读取时,建立的Document对象,只要更新相关的节点再保存即可。
此处为了练手,还是从头写了一遍。
2)document.appendChild 根节点
一开始词句忘记添加,所以导致输出空文本。
究其原因就是即使document.createElement后,也只是一个悬空节点,没有建立任何关系。
尤其是根节点,需要串联到document上。
3)此处即使使用了setOutputProperty("indent", "yes");
输出的文本文件,虽然节点之间有换行,
但是没有缩进,父节点和子节点的关系不是很明显。
解决方法:
在添加节点同时再添加一个上述的TextNode类型的子节点。
document.createTextNode("\n ");
(不知道还有没有其他更加好的办法。。。)
最近稍微接触了下用Java Dom 解析XML的文件。
遇到两个小问题,就在这里做个笔记吧~
1. Node 的 getNodeValue方法返回的一直是null。
其实还是由于对这个类不熟悉的关系,导致了这个问题。
Node有很多类型,一般<html> </html> 这种类型叫做Element Node。
需要得到其中的文本,直接使用getNodeValue方法是行不通的。
因为此Node中包含的文本其实是属于另外一种Node类型,即 Text Node。
所以此文本对应的Node,是上述<html> Element Node的子节点。
解决方法:如同网上各处所说的
.getFirstChild().getNodeValue(); (第一个子节点的Value值)
至于为啥Element Node的Node Value是null值,
参照JavaDoc可知,其定义就是如此。详细参照如下:
http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/org/w3c/dom/Node.html
2. 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
File f = new File( save_filename ); // 需要保存的名字
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
try {
builder = factory.newDocumentBuilder();
// createing a new DOM-document...
Document document = builder.newDocument(); // 1)
Element saveRoot = document.createElement("Root");
document.appendChild(saveRoot); // 2)
saveTree( saveRoot, document ); // 添加各种节点,建立DOM树
// Use a Transformer for output
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.setOutputProperty("indent", "yes"); // 3)
// transform DOM 2 XML file // 4)
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult( f );
transformer.transform(source, result);
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
其中使用到的
DocumentBuilderFactory / DocumentBuilder / TransformerFactory / DOMSource / StreamResult
意如其名,不用多解释了。
Question
1)全新 Document 的建立方式。
也可以使用读取时,建立的Document对象,只要更新相关的节点再保存即可。
此处为了练手,还是从头写了一遍。
2)document.appendChild 根节点
一开始词句忘记添加,所以导致输出空文本。
究其原因就是即使document.createElement后,也只是一个悬空节点,没有建立任何关系。
尤其是根节点,需要串联到document上。
3)此处即使使用了setOutputProperty("indent", "yes");
输出的文本文件,虽然节点之间有换行,
但是没有缩进,父节点和子节点的关系不是很明显。
解决方法:
在添加节点同时再添加一个上述的TextNode类型的子节点。
document.createTextNode("\n ");
(不知道还有没有其他更加好的办法。。。)