简单的请求封装,相当于封装了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. java 对excel操作 读取、写入、修改数据;导出数据库数据到excel

    ============前提加入jar包jxl.jar========================= // 从数据库导出数据到excel public List<Xskh> outPu ...

  2. Giraph之SSSP(shortest path)单机伪分布运行成功

    所遇问题:Exception 1: Exception in thread "main" java.lang.IllegalArgumentException: "che ...

  3. Openfire开发配置,Openfire源代码配置,OpenFire二次开发配置(eclipse)

    首先去官网把openfire的源码下下来: http://www.igniterealtime.org/downloads/source.jsp 1.下载后放到你的workspace当中,我的woek ...

  4. Proxy代理(AOP实现原理)

    AOP基于动态代理实现:返回代理对象 java.lang.reflect 包Proxy 类,构造代理类.newProxyInstance() 就是创建代理对象的方法. Proxy.newProxyIn ...

  5. 功能强大支持64位操作系统的转Flash软件(doc转swf):Print2Flash

    Print2Flash是一个虚拟打印机类的文档转换软件,因此只要是可打印的文档,都可以轻松转换为Flash文件,即SWF动画,特别是用于转换PDF.Word.Excel.PowerPoint等文档为S ...

  6. NAT类型与穿透 及 STUN TURN 协议

    STUN : Simple Traversal of User Datagram Protocol [UDP] Through Network Address Translators [NATs] S ...

  7. C#常用类汇总

    一.object常用类 1.获取去类的类型和公共属性 var a= new Class A(); var props = A.GetType().GetProperties();

  8. PostgreSQL下,对汉字按拼音排序

    参考学习此文: http://blog.163.com/digoal@126/blog/static/163877040201173003547236/ 建库 postgres=# \l List o ...

  9. 不要滥用div,保持代码的整洁

    这篇文章算是很基础的了.旨在介绍如何保证页面代码的整洁.以维护性.使用有语义的页面标签,减少标签的滥用. 1. 移除不必要的<div>标签 嵌套在<form><ul> ...

  10. HTTP状态码通常分为5种类型

    HTTP状态码通常分为5种类型,分别以1-5五个数字开头,由3位整数组成: -------------------------------------------------------------- ...