java中对xml文档的解析可以分为四种方式:DOM、JDOM、SAX、DOM4J
这里研究一下使用DOM方式进行xml文档的写入和解析的方法。
DOM解析XML文档时会遍历整个XML文档,在内存中建立一个树的数据结构。与JavaScript中DOM方法类似,我们可以通过getElementsByTagName方法获取到特定的标签对象,当然,同样的标签很多的话要使用List来存储返回的多个标签对象。另外通过DOM写XML文档也很方便,创建了节点之后依次连接到父节点上就OK了,最后通过Transformer把驻留在内存中建立好的DOM树通过io流写入到特定文本就OK。
使用DOM方式进行XML解析——
创建了一份简单的xml文档
在eclipse中新建项目DOM_Test,并把该xml文档拷贝到工程目录下。在代码中利用documentBuilder的parse方法可以传入需要被解析的XML文档。最后把解析出的元素输出,控制台输出结果贴个图:
附上 DOM解析XML文档的java代码demo:
public class DOM_Test {
public static void main(String[] args) {
//创建一个documentBuilderFactory对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//创建一个documentBuilder对象
try {
DocumentBuilder db = dbf.newDocumentBuilder();
//通过documentBuilder对象的parse方法加载book.xml到当前项目下
Document document = db.parse("book.xml");//传入需要被解析的XML文档的URI
//获取所有book节点的集合
NodeList bookList = document.getElementsByTagName("book");//通过标签获取元素
System.out.println("查询到有:"+bookList.getLength()+"本书");
for (int i = 0; i < bookList.getLength(); i++) {
System.out.println("===========下面开始遍历第"+(i+1)+"本书的内容============");
Element book = (Element) bookList.item(i);
String value = book.getAttribute("id");
System.out.println("属性id的值为:"+value);
//解析book节点和子节点
Node book_node = bookList.item(i);
NodeList childlist = book_node.getChildNodes();
System.out.println("第"+(i+1)+"本书共有"+childlist.getLength()+"个子节点");
for (int j = 0; j < childlist.getLength(); j++) {
if (childlist.item(j).getNodeType() == Node.ELEMENT_NODE) {
System.out.print("第"+(j+1)+"个节点的节点名:");
System.out.println(childlist.item(j).getNodeName()+" ---> "+
childlist.item(j).getFirstChild().getTextContent());
}
}
System.out.println("============book "+(i+1)+" END==================");
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
============================================================================
使用DOM方式进行XML创建和写入:
同理,利用documentBuilder就可以对xml文档进行build。在代码中创建好标签元素Element,并将其按照顺序通过append方法连接起来,运行时在内存中就会构建一个DOM树,最后用Transformer建立一个IO流把DOM树写入到目标文档里。
这是通过DOM创建的一份XML文档——
附上DOM创建写入XML文档的java代码demo:
public class DOM_Write {
public DocumentBuilder getDocumentBuilder(){
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
try {
db = dbf.newDocumentBuilder();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return db;
}
public void createXML(){
DocumentBuilder db = getDocumentBuilder();
Document document = db.newDocument();
document.setXmlStandalone(true);
Element bookstore = document.createElement("bookstore");
//向bookstore中添加子节点book
//创建子节点
Element book = document.createElement("book");
Element name = document.createElement("name");
Element author = document.createElement("author");
Element year = document.createElement("year");
Element publishing = document.createElement("publishing");
//给子节点赋值
name.setTextContent("退一步,并不难");
author.setTextContent("达照");
year.setTextContent("2015");
publishing.setTextContent("中国商业出版社");
//把子节点都连接到父节点上
book.appendChild(name);
book.appendChild(author);
book.appendChild(year);
book.appendChild(publishing);
book.setAttribute("id", "3");
//把book节点添加到bookstore中
bookstore.appendChild(book);
//把bookstore节点(包含book)添加到DOM树中
document.appendChild(bookstore);
//创建TransformerFactory对象
TransformerFactory tff = TransformerFactory.newInstance();
try {
//创建Transformer对象
Transformer tf = tff.newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");//换行
tf.transform(new DOMSource(document), new StreamResult(new File("book1.xml")));
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
DOM_Write write = new DOM_Write();
write.createXML();
}
}
有一个注意事项,在eclipse中创建document对象和element对象时候需要进行导包,这里导入的包应该是org.w3c.dom.Document和org.w3c.dom.Element,否则没有提供操纵XML的api,会报错。此demo里需要导入的剩下的包都是javax.xml下的包。
最近在学习web service。发现在service发布方和service使用方,都涉及到大量的xml的解析和写入。故做此博客,做学习过程中的一个小结。