简单的请求封装,相当于封装了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. POJ 1160Post Office

    POJ 1160    Post Office 我不知道优化,我只知道最暴力的方法,O(V^3),居然100ms不到的过了 设DP[i][j][k]表示考虑前i个小镇,放了j个邮局,最后一个邮局的所在 ...

  2. 关于JAVA多线程的那些事__初心者

    前言 其实事情的经过也许会复杂了点,这事还得从两个月前开始说.那天,我果断不干IT支援.那天,我立志要做一个真正的程序猿.那天,我26岁11个月.那天,我开始看Android.那天,我一边叨念着有朋自 ...

  3. JavaScript 各种遍历方式详解,有你不知道的黑科技

    http://segmentfault.com/a/1190000003968126 为了方便例子讲解,现有数组和json对象如下 var demoArr = ['Javascript', 'Gulp ...

  4. 我的javascript学习之路(一)对象之基础

    做了2个多月的ajax项目,对js的学习觉得了深入了不少,把自己的一些学习的经验贴出来,希望对初学者有所帮助,也希望大家能指出我的错误之处或者不当之处. javascript 是基于对象的语言,为什么 ...

  5. CodeForces 173E Camping Groups 离线线段树 树状数组

    Camping Groups 题目连接: http://codeforces.com/problemset/problem/173/E Description A club wants to take ...

  6. Codeforces Round #308 (Div. 2) D. Vanya and Triangles 水题

    D. Vanya and Triangles Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55 ...

  7. linux C 9*9

    #include<stdio.h> #include<conio.h> #include <windows.h> void Gotoxy(int x, int y) ...

  8. C++ Code_ScrollBar

    主题 1.  ScrollBar的使用 2. 3. 4. 5.      属性 HScrollBar VScrollBar 直接拖拽1其中任意空间到对话框上面是,你一拖拽滚动条,它立即回到原始位置   ...

  9. Google Map和桌面组件 Android开发教程

    本文节选于机械工业出版社推出的<Android应用开发揭秘>一 书,作者为杨丰盛.本书内容全面,详细讲解了Android框架.Android组件.用户界面开发.游戏开发.数据存储.多媒体开 ...

  10. 三星Galaxy S4(GT-I9500)获取ROOT权限教程(转)

    http://news.candou.com/2013-05-20/453695_1.shtml 获取root权限的方法