XMLObject 简易xml格式接口数据生成和解析工具
2015-03-27 13:26
417 查看
简单的请求封装,相当于封装了Book对象,但比Book对象参数更灵活
包含多个store元素的封装,
解析xml,获取值
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
相关文章推荐
- box2d 描点工具生成b2Shape数据(xml通用格式),oc、c++解析模块类文件,b2Shape数据可视化工具
- Xml格式数据的生成和解析
- codeTool代码自动生成工具(参数类sql数据增删改查语句,实体类,接口代码)
- .NET编程简易生成用友财务软件的财务接口数据
- PHP实现生成XML数据和解析XML格式数据
- box2d 描点工具生成b2Shape数据(xml通用格式),oc、c++解析模块类文件,b2Shape数据可视化工具
- NET编程简易生成用友财务软件的财务接口数据
- 新手入门,和风天气预报免费API接口用GSON工具实现数据解析
- 解析swf文件的音频数据并生成mp3
- ASP.NET中数据访问层自动生成的一些工具
- 数据库测试数据自动生成工具
- 使用mex C生成MATLAB的股票数据分析接口
- 摘要:了解 ASP.NET 2.0 中的用于生成自定义数据绑定控件的工具是如何演变的
- java生成xml格式数据
- 3.2 数据区表生成工具
- 前台利用javascript解析Json数据,生成编码折线
- SQL备份工具:自动从数据生成SQL脚本
- Asp.net(C#) 输出Xml格式数据---Rss生成
- sql server 数据脚本生成工具
- 数据自动生成工具 DataFactory 的简单使用