解析xml和生成xml(使用dom4j和velocity)

本文介绍如何使用DOM4J库解析XML并利用Velocity模板引擎生成XML。通过示例展示了如何将XML内容映射到Java对象,并提供了解析和生成XML的基本方法。解析过程涉及将XML转化为Document对象,而生成XML则介绍了三种方式,包括拼接字符串、使用Velocity模板和DOM4J创建节点。Velocity提供了一种灵活的模板语言,简化了动态内容的生成,降低了代码的复杂性。
摘要由CSDN通过智能技术生成

在项目中队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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值