简单的请求封装,相当于封装了Book对象,但比Book对象参数更灵活

XMLObject xml = new XMLObject("book");
xml.add("author", "Jack");
xml.add("name", "JavaScript");
XMLObject store = new XMLObject("store");
store.add("city", "NewYourk");
xml.add(store);
System.out.println(xml.toString());
//<book><author>Jack</author><name>JavaScript</name><store><city>NewYourk</city></store></book>

包含多个store元素的封装,

store = store.clone(); //复制store,否则之前的会被覆盖
store.update("city", "Washington"); //更新已有元素city的值,NewYourk => Washington
store.add("country", "America"); //第二个store可以灵活地添加元素
xml.add(store);
System.out.println(xml.toString());
//<book><author>Jack</author><name>JavaScript</name><store><city>NewYourk</city></store><store><city>Washington</city><country>America</country></store></book>

解析xml,获取值

xml = XMLObject.fromString(xml.toString());
System.out.println(xml.get("name")); //JavaScript
List<XMLObject> nodes = xml.getNodes("store");
for(XMLObject node : nodes) {
System.out.println(node.toString());
}
//<store><city>NewYourk</city></store>
//<store><city>Washington</city><country>America</country></store>
public class XMLObject implements Cloneable {
private String name;
private List<Object> nodes = new LinkedList<>(); /**
* @param name 不能包含特殊字符</>
*/
public XMLObject(String name) {
if(name!=null && name.matches("[^</>]+")) {
this.name = name;
}else {
throw new IllegalArgumentException("bad name: "+name);
}
}
public String getName() {
return name;
}
public void add(String field, String value) {
nodes.add(new FieldValue(field, value));
}
public void add(XMLObject node) {
nodes.add(node);
}
public boolean update(String field, String value) {
for(Object node : nodes) {
if(node instanceof FieldValue) {
FieldValue fv = (FieldValue)node;
if(fv.getField().equals(field)) {
fv.value = value;
return true;
}
}
}
return false;
}
public String get(String field) {
for(Object node : nodes) {
if(node instanceof FieldValue) {
FieldValue fv = (FieldValue)node;
if(fv.getField().equals(field))
return fv.getValue();
}
}
return null;
}
public XMLObject getNode(String field) {
for(Object node : nodes) {
if(node instanceof XMLObject) {
XMLObject obj = (XMLObject)node;
if(obj.name.equals(field))
return obj;
}
}
return null;
}
public List<XMLObject> getNodes(String field) {
List<XMLObject> objs = new LinkedList<>();
for(Object node : nodes) {
if(node instanceof XMLObject) {
XMLObject obj = (XMLObject)node;
if(obj.name.equals(field))
objs.add(obj);
}
}
return objs;
} public String toString() {
StringBuilder xml = new StringBuilder("<"+name+">");
for(Object node : nodes) {
if(node instanceof FieldValue) {
FieldValue fv = (FieldValue)node;
xml.append("<"+fv.field+">");
xml.append(fv.value);
xml.append("</"+fv.field+">");
}else if(node instanceof XMLObject) {
XMLObject obj = (XMLObject)node;
xml.append(obj.toString());
}
}
xml.append("</"+name+">");
return xml.toString();
} protected XMLObject clone() {
XMLObject xml = new XMLObject(name);
xml.nodes = new LinkedList<>();
for(Object node : this.nodes) {
if(node instanceof FieldValue) {
FieldValue fv = (FieldValue)node;
xml.add(fv.field, fv.value);
}else if(node instanceof XMLObject) {
XMLObject obj = (XMLObject)node;
obj = obj.clone();
xml.add(obj);
}
}
return xml;
}
public static String header() {
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
}
public static XMLObject fromString(String xml) {
XMLObject obj = null;
StringBuilder field = new StringBuilder(), value = new StringBuilder();
if(xml.startsWith(header())) xml = xml.substring(header().length());
boolean tag = false, start = false;
char[] cs = xml.toCharArray();
for(int i = 0; i<cs.length; i++) {
char c = cs[i];
switch(c) {
case '<':
tag = true;
start = true;
if(field.length()>0 && value.length()==0) {
int end = xml.indexOf("</"+field+">", i);
String subXml = xml.substring(i-field.length()-2, end+field.length()+3);
XMLObject sub = fromString(subXml);
obj.add(sub);
i = end+field.length()+3;
field.delete(0, field.length());
}
break;
case '>':
tag = false;
if(start) {
if(obj==null) {
obj = new XMLObject(field.toString());
field.delete(0, field.length());
}
}else {
if(field.length()>0 && field.length()>0) {
obj.add(field.toString(), value.toString());
field.delete(0, field.length());
value.delete(0, value.length());
}
}
break;
case '/':
start = false;
break;
default:
if(tag && start) field.append(c) ;
if(!tag) value.append(c);
break;
}
}
return obj;
} public static class FieldValue {
private String field;
private String value;
/**
* @param field 不能包含特殊字符</>
* @param value 不能包含特殊字符</>
*/
public FieldValue(String field, String value) {
if(field!=null && value!=null) {
boolean b = field.matches("[^</>]+");
if(b) b = value.matches("[^</>]+");
else throw new IllegalArgumentException("bad field: "+field); if(b) { this.field = field; this.value = value; }
else throw new IllegalArgumentException("bad value: "+value);
}else {
throw new IllegalArgumentException("bad field or value: "+field+","+value);
}
}
public String getField() {
return field;
}
public String getValue() {
return value;
}
}
}
原文地址:http://www.xlongwei.com/detail/15032713

XMLObject 简易xml格式接口数据生成和解析工具的更多相关文章

  1. ini格式数据生成与解析具体解释

    ini格式数据生成与解析具体解释 1.ini格式数据长啥样? watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/ ...

  2. C#操作数据表中XML格式的数据

    以前还真没有见过数据表中存储XML格式的数据,刚开始听说的时候,还以为是数据表中有XML的字段类型, 再了解,其实也就是字符串类型的,只不过字符串的格式是XML格式的.确实孤陋寡闻!汗... (可添加 ...

  3. xml格式的数据转化成数组

    将得到的xml格式的数据转化成数组 <?php //构造xml $url = "http://api.map.baidu.com/telematics/v3/weather?locat ...

  4. 如何在JSP页面里面显示xml格式的数据

    正常情况下,在jsp页面里的标签里写xml格式的数据,在浏览器里面的页面里显示出来的是乱码. 为什么会显示乱码呢?原来xml标签在jsp里会被解析为浏览器对象,因为xml最开始被设计出来是 为了写网页 ...

  5. scrapy 解析xml格式的数据

    XMLFeedSpider 主要用于 解析 xml格式的数据 创建一个scrapy 项目文件 scrapy startproject xxx 创建一个spider scrapy genspider - ...

  6. java中json数据生成和解析(复杂对象演示)

    1.json简单介绍 1.1 json是最流行和广泛通用的数据传输格式,简称JavaScript Object Notation,最早在JavaScript中使用. 1.2 举个例子,下面是一个jso ...

  7. dynamic解析Http xml格式响应数据

    继续上一篇 构建RESTful风格的WCF服务 ,咱已经把服务端的数据和服务准备好了,客户端调用 wcf rest接口后如何解析xml?下面使用dynamic关键字解析来至于WCF REST XML响 ...

  8. Asp.net Core WebApi 支持json/xml格式的数据返回

    Asp.net core 在做webapi项目的时候,默认是只返回json格式的数据的,如果想要开启xml数据返回,需要在startup里配置如下: public void ConfigureServ ...

  9. SpringMVC处理XML格式的数据

    1.搭建SpringMVC+spring环境 2.web.xml,Springmvc-config.xml.springMVC提供了处理xml格式请求响应的HttpMessageConverter,s ...

随机推荐

  1. Mahout之Canopy Clustering深入理解

    转自:http://www.cnblogs.com/vivounicorn/archive/2011/09/23/2186483.html Mahout学习——Canopy Clustering 聚类 ...

  2. 如何在协作开发安卓项目中打jar包给合作人

    一般情况下,id都是安卓自动生成的.使用时只要用R.id.xx就可以了.但是,在合作开发安卓时,需要将自己开发的代码部分打成jar包,甚至做混淆. 这就需要使用java的反射机制.在取id时使用如下类 ...

  3. UI:UINavigationController、界面通信

    IOS中实现对控制器的管理的控制器有:UINavigationController 和 UITableBarController 两个控制器.下面是主要学习前者. 参考 ⼀.UINavigationC ...

  4. GetSafeHwnd()函数解释[转]

    当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数,通过下面的例子来看其理由: CWnd *pwnd = FindWindow(“ ...

  5. (剑指Offer)面试题21:包含min函数的栈

    题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 在该栈中,调用min,push,pop的时间复杂度都是O(1) 思路: 1.除了原来的栈s,增加一个辅助栈s_min,用 ...

  6. Ext.form.ComboBox 后台取值 动态加载 ext5.0.0

    我用的extjs是5.0.0版本的. 请注意:如果这里没有的combobox相关内容,这里一定有. 开始的时候keyup事件取到的数据就是放不到ComboBox中,放全局变量也不好用.最后大神出手帮忙 ...

  7. Java Zip压缩实现

    最近在自学javaWeb,先复习一下java,把还给老师的东西再找回来(知识如果不用很快就会忘记啊).. 今天看到了zip压缩,决定要整理一下. java将有关zip压缩的内容都封装在java.uti ...

  8. How to Use a Function or a Procedure as a Parameter in another Function

    http://delphi.about.com/od/adptips2006/qt/functionasparam.htm In Delphi, procedural types (method po ...

  9. UVa11205 The Broken Pedometer

    // 题意:有P个LED灯,以及N个字符,要求选出个数最少的LED灯,使得即使只有这些灯正常工作,也能区分出这N个字符 // 题意抽象:输入两个整数P, N以及N行P列的01矩阵,找少的列,能区分所有 ...

  10. Asp.Net BulletedList

    BulletedList使用及详解 BulletedList是一个让你轻松在页面上显示项目符号和编号格式(Bulledted List)的控件.对于ASP.NET 1.x里要动态显示Bulledted ...