在项目中队xml的解析和生成几乎每个程序员都要遇到。既然如此,对这个不熟悉就说不过去了,打好基础吧。
现在学习如何对xml解析和怎样生成xml。
首先,写一个xml,作为我们研究的样本。
XmlMessage.xml
<?xml version="1.0" encoding="UTF-8"?>
<transaction name="BuyBooks">
<header>
<title name="charset">UTF-8</title>
<title name="system">MALL</title>
</header>
<body>
<field attr="word">Welcome</field>
<field attr="people">all you guys</field>
<array>
<book key="bookId">100010</book>
<book key="bookName">唐诗300首</book>
<book key="bookPrice">21元</book>
<book key="bookQuantity">135本</book>
</array>
<array>
<book key="bookId">100012</book>
<book key="bookName">宋词</book>
<book key="bookPrice">15元</book>
<book key="bookQuantity">121本</book>
</array>
</body>
</transaction>
好,现在我们就把这个作为研究的样本来看看怎解析它。
Java是面向对象编程的,所以第一步,你肯定想到了,解析后的内容要放在一个变量里。
这样在需要时就直接对变量进行操作了。
那么对应这个xml,我们应该对变量配置那些属性呢?
其实,这个要根据你的业务来定了。比如,在这个xml中,
<header>
<title name="charset">UTF-8</title>
<title name="system">MALL</title>
</header>
这部分是必然有的,
<field attr="word">Welcome</field>
<field attr="people">all you guys</field>
也是必然有的,唯一就是那个
<array>
<book key="bookId">100010</book>
<book key="bookName">唐诗300首</book>
<book key="bookPrice">21元</book>
<book key="bookQuantity">135本</book>
</array>
可有可无,也可由多个。
针对这样的业务,我们就把必有的属性都配置一个属性,多个或没有的就配置成一个容器(比如List)。
这个看你的业务了,如果里面的属性变化太大,则可以具体细分成多个对象定义成一个总的对象。
总之,要把对象的属性和xml中定义的一一对应就可以。
针对这个xml,我这样定义:
XmlMessage
package org.xml.bean;
import java.util.ArrayList;
import java.util.List;
public class XmlMessage {
private String charset;
private String system;
private String word;
private String people;
private List<Book> array=new ArrayList<Book>();
private String transaction;
public String getCharset() {
return charset;
}
public void setCharset(String charset) {
this.charset = charset;
}
public String getSystem() {
return system;
}
public void setSystem(String system) {
this.system = system;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public String getPeople() {
return people;
}
public void setPeople(String people) {
this.people = people;
}
public List<Book> getArray() {
return array;
}
public void setArray(List<Book> array) {
this.array = array;
}
public String getTransaction() {
return transaction;
}
public void setTransaction(String transaction) {
this.transaction = transaction;
}
}
Book
package org.xml.bean;
public class Book {
private String bookId;
private String bookName;
private String bookPrice;
private String bookQuantity;
public String getBookId() {
return bookId;
}
public void setBookId(String bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getBookPrice() {
return bookPrice;
}
public void setBookPrice(String bookPrice) {
this.bookPrice = bookPrice;
}
public String getBookQuantity() {
return bookQuantity;
}
public void setBookQuantity(String bookQuantity) {
this.bookQuantity = bookQuantity;
}
}
现在看出对应关系了吧。
在开始之前,先写一个打印对象的方法,只要能打印出对象的属性和值就可以。一般可以使用toString()方法,
但是我建议写成json格式的,应为在web层页面需要处理对象的时候,使用json很方便。这里只是为了打印。
JsonUtil
package org.xml.util;
import net.sf.json.JSONObject;
public class JsonUtil{
public static String objectToJson(Object obj){
String result="";
if(obj!=null){
try{
result=JSONObject.fromObject(obj).toString();
}catch(Exception ee){
ee.printStackTrace();
}
}
return result;
}
public static void main(String[] arg) throws Exception{
}
}
准备工作都做好了,现在开始解析。
对于解析xml,首选当然是dom4j。
写一个工具类
Dom4jXmlUtil
package org.xml.util;
import java.io.File;
import java.io.InputStream;
import java.io.StringReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.DOMReader;
import org.dom4j.io.SAXReader;
import org.xml.bean.Book;
import org.xml.bean.XmlMessage;
import org.xml.sax.InputSource;
public class Dom4jXmlUtil {
public Dom4jXmlUtil() {}
public static SAXReader createSAXReader() {
return new SAXReader();
}
public static DOMReader createDOMReader() {
return new DOMReader();
}
public static Document read(InputStream is) {
try {
return createSAXReader().read(is);
} catch (DocumentException e) {
throw new RuntimeException(e);
}
}
public static Document read(File file) {
try {
return createSAXReader().read(file