转自: http://blog.youkuaiyun.com/cds27/archive/2008/03/02/2139110.aspx
这是一个用JAVA W3C DOM 进行XML操作的例子,包含了查询、增加、修改、删除、保存的基本操作。较完整的描述了一个XML的整个操作流程。适合刚入门JAVA XML操作的朋友参考和学习。
假设有XML文件:test1.xml
<?
xml version="1.0" encoding="UTF-8"
?>
<
books
>
<
book
>
<
name
>
哈里波特
</
name
>
<
price
>
10
</
price
>
<
memo
>
这是一本很好看的书。
</
memo
>
</
book
>
<
book
id
="B02"
>
<
name
>
三国演义
</
name
>
<
price
>
10
</
price
>
<
memo
>
四大名著之一。
</
memo
>
</
book
>
<
book
id
="B03"
>
<
name
>
水浒
</
name
>
<
price
>
6
</
price
>
<
memo
>
四大名著之一。
</
memo
>
</
book
>
<
book
id
="B04"
>
<
name
>
红楼
</
name
>
<
price
>
5
</
price
>
<
memo
>
四大名著之一。
</
memo
>
</
book
>
</
books
>
下面是为Test.java
import
java.io.File;
import
java.io.FileNotFoundException;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
org.w3c.dom.
*
;
import
org.xml.sax.SAXException;
import
javax.xml.parsers.
*
;
import
javax.xml.transform.
*
;
import
javax.xml.transform.dom.DOMSource;
import
javax.xml.transform.stream.
*
;
import
javax.xml.xpath.
*
;
public
class
Test
{
public
static
void
main(String[] args)
{
DocumentBuilderFactory factory
=
DocumentBuilderFactory.newInstance();
Element theBook
=
null
, theElem
=
null
, root
=
null
;
try
{
factory.setIgnoringElementContentWhitespace(
true
);
DocumentBuilder db
=
factory.newDocumentBuilder();
Document xmldoc
=
db.parse(
new
File(
"
Test1.xml
"
));
root
=
xmldoc.getDocumentElement();
//
--- 新建一本书开始 ----
theBook
=
xmldoc.createElement(
"
book
"
);
theElem
=
xmldoc.createElement(
"
name
"
);
theElem.setTextContent(
"
新
书
"
);
theBook.appendChild(theElem);
theElem
=
xmldoc.createElement(
"
price
"
);
theElem.setTextContent(
"
20
"
);
theBook.appendChild(theElem);
theElem
=
xmldoc.createElement(
"
memo
"
);
theElem.setTextContent(
"
新
书的更好看。
"
);
theBook.appendChild(theElem);
root.appendChild(theBook);
System.out.println(
"
--- 新
建一本书开始 ----
"
);
output(xmldoc);
//
--- 新建一本书完成 ----
//
--- 下面对《哈里波特》做一些修
改。 ----
//
--- 查询找《哈里波特》----
theBook
=
(Element) selectSingleNode(
"
/books
/book[name='哈里波特']
"
, root);
System.out.println(
"
--- 查
询找《哈里波特》 ----
"
);
output(theBook);
//
--- 此时修改这本书的价格 -----
theBook.getElementsByTagName(
"
price
"
).item(
0
).setTextContent(
"
15
"
);
//
getElementsByTagName返回的是NodeList,所以要跟上item(0)。另
外,getElementsByTagName("price")相当于xpath的".//price"。
System.out.println(
"
--- 此
时修改这本书的价格 ----
"
);
output(theBook);
//
--- 另外还想加一个属性id,值为
B01 ----
theBook.setAttribute(
"
id
"
,
"
B01
"
);
System.out.println(
"
--- 另
外还想加一个属性id,值为B01 ----
"
);
output(theBook);
//
--- 对《哈里波特》修改完
成。 ----
//
--- 要用id属性删除《三国演义》这本
书 ----
theBook
=
(Element) selectSingleNode(
"
/books/book[@id='B02']
"
, root);
System.out.println(
"
--- 要
用id属性删除《三国演义》这本书 ----
"
);
output(theBook);
theBook.getParentNode().removeChild(theBook);
System.out.println(
"
--- 删
除后的XML ----
"
);
output(xmldoc);
//
--- 再将所有价格低于10的书删
除 ----
NodeList someBooks
=
selectNodes(
"
/books/book[price<10]
"
, root);
System.out.println(
"
--- 再
将所有价格低于10的书删除 ---
"
);
System.out.println(
"
--- 符
合条件的书有
"
+
someBooks.getLength()
+
"
本。 ---
"
);
for
(
int
i
=
0
;i
<
someBooks.getLength();i
++
)
{
someBooks.item(i).getParentNode().removeChild(someBooks.item(i));
}
output(xmldoc);
saveXml(
"
Test1_Edited.xml
"
, xmldoc);
}
catch
(ParserConfigurationException e)
{
e.printStackTrace();
}
catch
(SAXException e)
{
e.printStackTrace();
}
catch
(IOException e)
{
e.printStackTrace();
}
}
public
static
void
output(Node node)
{
//
将node的XML字符串输出到控制台
TransformerFactory transFactory
=
TransformerFactory.newInstance();
try
{
Transformer transformer
=
transFactory.newTransformer();
transformer.setOutputProperty(
"
encoding
"
,
"
gb2312
"
);
transformer.setOutputProperty(
"
indent
"
,
"
yes
"
);
DOMSource source
=
new
DOMSource();
source.setNode(node);
StreamResult result
=
new
StreamResult();
result.setOutputStream(System.out);
transformer.transform(source, result);
}
catch
(TransformerConfigurationException e)
{
e.printStackTrace();
}
catch
(TransformerException e)
{
e.printStackTrace();
}
}
public
static
Node selectSingleNode(String express, Object source)
{
//
查找节点,并返回第一个符合条件节点
Node result
=
null
;
XPathFactory xpathFactory
=
XPathFactory.newInstance();
XPath xpath
=
xpathFactory.newXPath();
try
{
result
=
(Node) xpath.evaluate(express, source, XPathConstants.NODE);
}
catch
(XPathExpressionException e)
{
e.printStackTrace();
}
return
result;
}
public
static
NodeList selectNodes(String express, Object source)
{
//
查找节点,返回符合条件的节点集。
NodeList result
=
null
;
XPathFactory xpathFactory
=
XPathFactory.newInstance();
XPath xpath
=
xpathFactory.newXPath();
try
{
result
=
(NodeList) xpath.evaluate(express, source, XPathConstants.NODESET);
}
catch
(XPathExpressionException e)
{
e.printStackTrace();
}
return
result;
}
public
static
void
saveXml(String fileName, Document doc)
{
//
将Document输出到文件
TransformerFactory transFactory
=
TransformerFactory.newInstance();
try
{
Transformer transformer
=
transFactory.newTransformer();
transformer.setOutputProperty(
"
indent
"
,
"
yes
"
);
DOMSource source
=
new
DOMSource();
source.setNode(doc);
StreamResult result
=
new
StreamResult();
result.setOutputStream(
new
FileOutputStream(fileName));
transformer.transform(source, result);
}
catch
(TransformerConfigurationException e)
{
e.printStackTrace();
}
catch
(TransformerException e)
{
e.printStackTrace();
}
catch
(FileNotFoundException e)
{
e.printStackTrace();
}
}
}