java操作xml有许多的框架,jdom,dom4j等等,生成xml也方便。最近项目中有许多地方都需要生成xml,于是想进行二次封装,以便更简单地生成xml。
因为项目中原来使用的是dom4j,就对dom4j进行二次封装。
import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
*
* @author xxoo
*
*/
public class XmlCreater {
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 节点名称
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private String name;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 节点属性
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private Map<String,String> attr;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 子节点
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private List<XmlCreater> child;
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 节点值<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private String text;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public XmlCreater() {
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public static XmlCreater build(String name){
<span style="white-space:pre"> </span>XmlCreater bean = new XmlCreater();
<span style="white-space:pre"> </span>bean.setName(name);
<span style="white-space:pre"> </span>return bean;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public static XmlCreater build4StrChild(String name,String text){
<span style="white-space:pre"> </span>XmlCreater bean = new XmlCreater();
<span style="white-space:pre"> </span>bean.setText(text);
<span style="white-space:pre"> </span>bean.setName(name);
<span style="white-space:pre"> </span>return bean;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public static XmlCreater build4ListChild(String name,List child){
<span style="white-space:pre"> </span>XmlCreater bean = new XmlCreater();
<span style="white-space:pre"> </span>bean.setChild(child);
<span style="white-space:pre"> </span>bean.setName(name);
<span style="white-space:pre"> </span>return bean;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>/***
<span style="white-space:pre"> </span> * 增加子节点
<span style="white-space:pre"> </span> * @param bean
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public void addChild(XmlCreater bean){
<span style="white-space:pre"> </span>if(this.child==null){
<span style="white-space:pre"> </span>this.child=new ArrayList<XmlCreater>();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>this.child.add(bean);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 增加一个名称为name,值为text的子节点
<span style="white-space:pre"> </span> * @param name
<span style="white-space:pre"> </span> * @param text
<span style="white-space:pre"> </span> * @return 新增的节点
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public XmlCreater addChildByText(String name,String text){
<span style="white-space:pre"> </span>XmlCreater bean = build4StrChild(name, text);
<span style="white-space:pre"> </span>addChild(bean);
<span style="white-space:pre"> </span>return bean;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 增加一个名称为name子节点
<span style="white-space:pre"> </span> * @param name
<span style="white-space:pre"> </span> * @return 新增的节点
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public XmlCreater addChildByName(String name){
<span style="white-space:pre"> </span>XmlCreater bean =build(name);
<span style="white-space:pre"> </span>addChild(bean);
<span style="white-space:pre"> </span>return bean ;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 新增节点的属性
<span style="white-space:pre"> </span> * @param name 属性名
<span style="white-space:pre"> </span> * @param value 属性值
<span style="white-space:pre"> </span> * @return
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public XmlCreater addAttr(String name,String value){
<span style="white-space:pre"> </span>if(this.attr==null){
<span style="white-space:pre"> </span>this.attr = new TreeMap<String,String>();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>this.attr.put(name, value);
<span style="white-space:pre"> </span>return this;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>/***
<span style="white-space:pre"> </span> * 利用dom4j 生成对应的xml
<span style="white-space:pre"> </span> * @return
<span style="white-space:pre"> </span> * @throws IOException
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public String getXml(){
<span style="white-space:pre"> </span> XmlCreater xmlBean = this;
<span style="white-space:pre"> </span> Document dom=DocumentHelper.createDocument();//创建xml文件
<span style="white-space:pre"> </span> Element ele=dom.addElement(xmlBean.getName());//添加根元素,Xval
<span style="white-space:pre"> </span> parseElemet(xmlBean, ele);
<span style="white-space:pre"> </span> String xml=dom.asXML();
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span> return xml;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 是否带xml格式的输出
<span style="white-space:pre"> </span> * @param format
<span style="white-space:pre"> </span> * @return
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public String getXml(boolean format){
<span style="white-space:pre"> </span>if(format){
<span style="white-space:pre"> </span>XmlCreater xmlBean = this;
<span style="white-space:pre"> </span>Document dom=DocumentHelper.createDocument();//创建xml文件
<span style="white-space:pre"> </span>Element ele=dom.addElement(xmlBean.getName());//添加根元素,Xval
<span style="white-space:pre"> </span>parseElemet(xmlBean, ele);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span> OutputFormat xmlFormat = new OutputFormat();
<span style="white-space:pre"> </span> // 设置换行
<span style="white-space:pre"> </span> xmlFormat.setNewlines(true);
<span style="white-space:pre"> </span> // 生成缩进
<span style="white-space:pre"> </span> xmlFormat.setIndent(true);
<span style="white-space:pre"> </span> // 使用4个空格进行缩进, 可以兼容文本编辑器
<span style="white-space:pre"> </span> xmlFormat.setIndent(" ");
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span> XMLWriter xw = null;
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>xw = new XMLWriter(xmlFormat);
<span style="white-space:pre"> </span>xw.write(dom);
<span style="white-space:pre"> </span>xw.close();<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>} catch (IOException e) {
<span style="white-space:pre"> </span>e.printStackTrace();
<span style="white-space:pre"> </span>return null;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return xw.toString();
<span style="white-space:pre"> </span>}else{
<span style="white-space:pre"> </span>return getXml();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>private static Element createChild(XmlCreater xmlBean,Element parent){
<span style="white-space:pre"> </span> Element ele = parent.addElement(xmlBean.getName());
<span style="white-space:pre"> </span> parseElemet(xmlBean,ele);
<span style="white-space:pre"> </span> return ele;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>private static void parseElemet(XmlCreater xmlBean,Element ele){
<span style="white-space:pre"> </span> //设置节点内容或者节点的子节点
<span style="white-space:pre"> </span> if(xmlBean.getText()!=null){//有文本则设置文本
<span style="white-space:pre"> </span> ele.setText(xmlBean.getText());
<span style="white-space:pre"> </span> }else if(xmlBean.getChild()!=null){//有子元素则循环遍历
<span style="white-space:pre"> </span> List<XmlCreater> child = xmlBean.getChild();
<span style="white-space:pre"> </span> for(XmlCreater bean:child){
<span style="white-space:pre"> </span> createChild(bean,ele);
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> //设置节点的属性
<span style="white-space:pre"> </span> if(xmlBean.getAttr()!=null){
<span style="white-space:pre"> </span> Map<String,String> attr = xmlBean.getAttr();
<span style="white-space:pre"> </span> Iterator<String> ite = attr.keySet().iterator();
<span style="white-space:pre"> </span> while(ite.hasNext()){
<span style="white-space:pre"> </span> String k = ite.next();
<span style="white-space:pre"> </span> ele.addAttribute(k, attr.get(k));
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public String getName() {
<span style="white-space:pre"> </span>return name;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public void setName(String name) {
<span style="white-space:pre"> </span>this.name = name;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public List<XmlCreater> getChild() {
<span style="white-space:pre"> </span>return child;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public void setChild(List<XmlCreater> child) {
<span style="white-space:pre"> </span>this.child = child;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public String getText() {
<span style="white-space:pre"> </span>return text;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public void setText(String text) {
<span style="white-space:pre"> </span>this.text = text;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public Map<String, String> getAttr() {
<span style="white-space:pre"> </span>return attr;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public void setAttr(Map<String, String> attr) {
<span style="white-space:pre"> </span>this.attr = attr;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
}
//demo
</pre><pre name="code" class="java">XmlCreater xmlCreater = XmlCreater.build("user");//根节点user
xmlCreater.addChildByText("age", "40");//新增子节点age,value为40
xmlCreater.addChildByText("name", "jim").addAttr("a1", "v1").addAttr("a2", "v2");//新增子节点name,value为jim,以及节点的属性
XmlCreater family = XmlCreater.build("family");//新增子节点family,family还有子节点为“wife”和“son”
family.addChildByText("wife", "mariy");
family.addChildByText("son", "white");
xmlCreater.addChild(family);
System.out.println("------不带格式----");
System.out.println(xmlCreater.getXml());//输出xml
System.out.println("------带格式----");
System.out.println(xmlCreater.getXml(true));//输出xml
//输出结果
XmlCreater xmlCreater = XmlCreater.build("user");//根节点user
xmlCreater.addChildByText("age", "40");//新增子节点age,value为40
xmlCreater.addChildByText("name", "jim").addAttr("a1", "v1").addAttr("a2", "v2");//新增子节点name,value为jim,以及节点的属性
XmlCreater family = XmlCreater.build("family");//新增子节点family,family还有子节点为“wife”和“son”
family.addChildByText("wife", "mariy");
family.addChildByText("son", "white");
xmlCreater.addChild(family);
System.out.println("------不带格式----");
System.out.println(xmlCreater.getXml());//输出xml
System.out.println("------带格式----");
System.out.println(xmlCreater.getXml(true));//输出xml