Java 生成Xml轻量级工具

只想简单的生成一个xml字符串, 发现找不到合适的方案, 于是从国外c语言生成xml工具翻译了一个过来。原文链接

package nc.vo.yceai.pub;

import java.util.Stack;
import java.util.Vector;

/**
 * 目标: 返回一个xml文本
 * 原因: 用字符串拼凑太麻烦, Dom太重量级, 提供一个介于中间的生成xml工具
 * 
 * @version V5.0
 * @author wuzq
 * @date   2014-11-6
 * @see http://www.codeproject.com/Articles/13498/XMLWriter-A-simple-reusable-class
 */
public class StringXmlWriter {
    
    private StringBuilder m_xml;//输出端
    private int m_iLevel;//用来处理缩进
    private Vector<String> m_attrVect;//存放属性,只存放当前标签的属性, 输出标签后清除
    private Stack<String> m_tagStack;//存放标签, 用来自动输出关闭标签
    
    public static void main(String[] args) {
        //Example 
        StringXmlWriter billXml = new StringXmlWriter();
        billXml.addComment("示例");
        billXml.addAttributes("attr", "ROOT");//在添加标签前, 你可以添加任意个属性
        billXml.createTag("Bills");//添加标签
        billXml.addAttributes("attr", "单据");
        billXml.createTag("Bill");
        
        billXml.addComment("表头");
        billXml.createTextTag("pk_corp", "1001");
        billXml.createTextTag("pk_billtype", "YXB8");
        
        billXml.addComment("表体");
        billXml.createTag("Bodys");
        
        billXml.addAttributes("attr", "第一行");
        billXml.createTag("Body");
        billXml.createTextTag("pk_corp", "1001");
        billXml.closeLastTag();
        
        billXml.addAttributes("attr", "第二行");
        billXml.createTag("Body");
        billXml.createTextTag("pk_corp", "1002");
        billXml.closeLastTag();
        
        billXml.closeAllTags();
        System.out.println(billXml);
    }
    
    public StringXmlWriter()
    {
        super();
        m_xml = new StringBuilder();
        m_attrVect = new Vector<String>();
        m_tagStack = new Stack<String>();
        String encoding = null;
        try{
            encoding = YCEaiPubConfig.getInstance().getEncode();
        }catch (Exception e) {
            encoding = "utf-8";
        }
        m_xml.append("<?xml version=\"1.0\"  encoding=\"" + encoding + "\"?>");
    }
    
    /**
     * 添加xml标签, 如果标签有属性, 则必须先添加属性
     * @param tag
     * @author wuzq
     * @date 2014-11-6 下午3:33:48
     */
    public void createTag(String tag){
        m_xml.append("\n");
        for(int i =0;i<m_iLevel;i++)
            m_xml.append("\t");
        m_xml.append("<").append(tag);
        addAttrToTag();
        m_xml.append(">");
        m_tagStack.push(tag);
        m_iLevel++;
    }

    private void addAttrToTag() {
        while(0 < m_attrVect.size()/2){
            String attr = m_attrVect.remove(m_attrVect.size()-1);
            m_xml.append(" ").append(attr).append("=");
            attr = m_attrVect.remove(m_attrVect.size()-1);
            m_xml.append("\"").append(attr).append("\"");
        }
        m_attrVect.clear();
    }
    
    /**
     * 关闭标签
     * 
     * @author wuzq
     * @date 2014-11-6 下午3:38:28
     */
    public void closeLastTag(){
        m_xml.append("\n");
        m_iLevel--;
        for(int i=0; i<m_iLevel; i++){
            m_xml.append("\t");
        }
        m_xml.append("</").append(m_tagStack.pop()).append(">");
    }
    
    /**
     * 关闭所有标签
     * 
     * @author wuzq
     * @date 2014-11-6 下午3:49:44
     */
    public void closeAllTags(){
        while(m_tagStack.size() != 0){
            m_xml.append("\n");
            m_iLevel--;
            for(int i=0;i<m_iLevel; i++){
                m_xml.append("\t");
            }
            m_xml.append("</").append(m_tagStack.pop()).append(">");
        }
    }
    
    /**
     * 添加子标签, 如果子标签有属性, 则必须先添加属性
     * @param tag
     * @param value
     * @author wuzq
     * @date 2014-11-6 下午3:50:37
     */
    public void createTextTag(String tag, String value){
        m_xml.append("\n");
        for(int i=0; i<m_iLevel; i++){
            m_xml.append("\t");
        }
        m_xml.append("<").append(tag);
        addAttrToTag();
        m_xml.append(">").append(value).append("</").append(tag).append(">");
    }
    
    /**
     * 添加属性
     * @param key
     * @param value
     * @author wuzq
     * @date 2014-11-6 下午3:56:04
     */
    public void addAttributes(String key, String value){
        m_attrVect.addElement(value);
        m_attrVect.addElement(key);
    }
    
    /**
     * 添加注释
     * @param comment
     * @author wuzq
     * @date 2014-11-6 下午3:58:48
     */
    public void addComment(String comment){
        m_xml.append("\n");
        for(int i=0; i<m_iLevel; i++){
            m_xml.append("\t");
        }
        m_xml.append("<!--").append(comment).append("-->");
    }
    
    @Override
    public String toString() {
        return m_xml.toString();
    }

}


示例的执行结果:

<?xml version="1.0"  encoding="utf-8"?>
<!--示例-->
<Bills attr="ROOT">
    <Bill attr="单据">
        <!--表头-->
        <pk_corp>1001</pk_corp>
        <pk_billtype>YXB8</pk_billtype>
        <!--表体-->
        <Bodys>
            <Body attr="第一行">
                <pk_corp>1001</pk_corp>
            </Body>
            <Body attr="第二行">
                <pk_corp>1002</pk_corp>
            </Body>
        </Bodys>
    </Bill>
</Bills>


转载于:https://my.oschina.net/startfz/blog/341729

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值