构造Xml字符串

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
 
/**
 * 根据该对象可以构造Xml字符串
 * @author zhangpeng
 *
 */
public class XmlObject {
    private static String HEAD = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
    private String name;
    private Object value;
    private Map<String, Object> attributes;
    private List<XmlObject> subXmlObjects;
 
    /**
     * 根据name构造XmlObject
     *
     * @param name
     *            生成xml时标签名,如name="html",则生成xml为<html/>
     */
    public XmlObject(String name) {
        this.name = name;
    }
 
    /**
     * 获得当前对象的名称
     *
     * @return 返回当前对象的名称
     */
    public String getName() {
        return name;
    }
 
    /**
     * 设置当前对象的名称
     *
     * @param name
     *            给定名称
     */
    public void setName(String name) {
        this.name = name;
    }
 
    /**
     * 获得当前对象的值
     *
     * @return 返回当前对象的值
     */
    public Object getValue() {
        return value;
    }
 
    /**
     * 设置当前对象的值
     *
     * @param value
     *            给定值
     */
    public void setValue(Object value) {
        this.value = value;
    }
 
    /**
     * 为当前XmlObject添加属性
     *
     * @param name
     *            属性名
     * @param value
     *            属性值
     */
    public void addAttribute(String name, Object value) {
        if (attributes == null) {
            attributes = new LinkedHashMap<String, Object>();
        }
        if (name != null && !name.trim().equals("") && !name.equals(this.name)) {
            attributes.put(name, value);
        }
    }
     
    /**
     * 为当前XmlObject添加属性
     *
     * @param name
     *            属性名
     * @param value
     *            属性值
     */
    public void setAttribute(String name, Object value) {
        addAttribute(name, value);
    }
 
    /**
     * 根据属性名称获得当前XmlObject对象的属性值
     *
     * @param name
     *            属性名称
     * @return 属性值
     */
    public Object getAttributeValue(String name) {
        return getAttributeValue(name, null);
    }
 
    /**
     * 根据属性名称获得当前XmlObject对象的属性值
     *
     * @param name
     *            属性名称
     * @param defaultValue
     *            默认值
     * @return 若属性存在,则返回属性值,否则返回默认值
     */
    public Object getAttributeValue(String name, Object defaultValue) {
        Object value = attributes.get(name);
        return value == null ? defaultValue : value;
    }
 
    /**
     * 为当前XmlObject对象添加子XmlObject对象
     *
     * @param xmlObject
     *            给定XmlObject对象
     */
    public void addSubXmlObject(XmlObject xmlObject) {
        if (subXmlObjects == null) {
            subXmlObjects = new ArrayList<XmlObject>();
        }
        if (xmlObject != null) {
            subXmlObjects.add(xmlObject);
        }
    }
     
    public List<XmlObject> getSubXmlObjectsByName(String name) {
        List<XmlObject> xmlObjects = new ArrayList<XmlObject>();
        for (XmlObject temp: subXmlObjects) {
            if (temp.getName().equals(name)) {
                xmlObjects.add(temp);
            }
        }
        return xmlObjects;
    }
     
    public XmlObject getUniqueSubXmlObjectByName(String name) {
        for (XmlObject temp: subXmlObjects) {
            if (temp.getName().equals(name)) {
                return temp;
            }
        }
        return null;
    }
 
    /**
     * 构造当前对象的压缩XML字符串
     *
     * @return XML字符串
     */
    public String toCompactXml() {
        return HEAD + getNoHeadXml("", "");
    }
 
    /**
     * 根据格式化留白("\t")和默认的行分隔符("\t")构造当前对象的XML字符串
     *
     * @return XML字符串
     */
    public String toFormatXml() {
        return HEAD + getNoHeadXml("\t", "\n");
    }
 
    /**
     * 根据格式化留白和默认的行分隔符构("\n")造当前对象的XML字符串
     *
     * @param blank
     *            格式化留白
     * @return XML字符串
     */
    public String toFormatXml(String blank) {
        return HEAD + getNoHeadXml(blank, "\n");
    }
 
    /**
     * 根据格式化留白和行分隔符构造当前对象的无头的XML字符串
     *
     * @param blank
     *            格式化留白
     * @param split
     *            行分隔符
     * @return 无头的XML字符串
     */
    private String getNoHeadXml(String blank, String split) {
        return getNoHeadXml(blank, split, 0);
    }
 
    private String getNoHeadXml(String blank, String split, int count) {
        String blanks = "";
        for (int i = 0; i < count; i++) {
            blanks += blank;
        }
        StringBuffer sb = new StringBuffer();
        sb.append(count == 0 ? split : "");
        sb.append(blanks + "<" + name);
        if (attributes != null) {
            Set<Entry<String, Object>> set = attributes.entrySet();
            for (Entry<String, Object> entry : set) {
                String tempName = entry.getKey();
                Object tempValue = entry.getValue();
                if (tempName != null && tempValue != null) {
                    sb.append(" " + tempName + "=\"" + tempValue + "\"");
                }
            }
        }
        if (subXmlObjects == null) {
            if (value == null) {
                sb.append("/>" + split);
            } else {
                sb.append(">");
                sb.append(value);
                sb.append("</" + name + ">" + split);
            }
        } else {
            sb.append(">" + split);
            Iterator<XmlObject> iterator = subXmlObjects.iterator();
            count += 1;
            while (iterator.hasNext()) {
                XmlObject xmlObject = iterator.next();
                sb.append(xmlObject.getNoHeadXml(blank, split, count));
            }
            sb.append(blanks + "</" + name + ">" + split);
        }
        return sb.toString();
    }
}

  

posted @   吴超文  阅读(357)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示