一個輕量的XML生成工具

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

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 = "utf-8";
        }catch (Exception e) {
            
        }
        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>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容