Android XStream 解析xml数据变成bean,支持CDATA

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 参考1、Android 用 XStream 将复杂xml解析为javabean2、XStream支持CDATA标签3、Retrofit 用Soap协议访问WebService 详解实例留着上一篇retrofit访问webservice后,...

参考

1、Android 用 XStream 将复杂xml解析为javabean
2、XStream支持CDATA标签
3、Retrofit 用Soap协议访问WebService 详解

实例

留着上一篇retrofit访问webservice后,最后到访问成功,到需要解析CDATA数据为止,继续下面的工作,先看下数据格式吧:

 * CDATA具体数据
 <![CDATA[
 <updatedata>
    <table>
        <name>table_xxx</name>
        <field>id, codeid, name, pid, remark, inputdate, modifydate, status, type_num</field>
        <values>
            <value>302|302|亚硝酸盐|1|检测项目|2016-08-24 10:58:51.0|null|C|null</value>
            ...
            <value>472|472|酱油氨基态氮|1|检测项目|2016-08-24 10:58:51.0|null|C|null</value>
        </values>
    </table>-200

    <table>
        <name>table_yyy</name>
        <field>id, inputdate, modifydate, decision_basis, max_limit, min_limit, test_basis, unit, food_type, test_item</field>
        <values>
            ....
        </values>
    </table>
 </updatedata>
 ]]>

好吧。。。还需需要利器来解析,XStream来也(其他 SAX-xml,JSoup-html 应该也可以)

1、app 下的build.gradle,添加依赖
    compile ('com.thoughtworks.xstream:xstream:1.4.7') {
        exclude group: 'xmlpull', module: 'xmlpull'
    }
2、xml的bean建立
2.1、@XStreamAlias 根节点
2.2、@XStreamImplicit 子节点
2.3、解释:(1)、子节点是值的话直接用 String xxSameAsElementName 来获取 (2)、子节点里面还有子节点的话用bean来获取,名字可取Element一样的,不一样要注解 (3)、子节点有N个相同的话用List<Bean>来获取,且需要注解子节点

1、第一层:updatedata是根节点,有子节点table且多个,用list<bean>
2、第二层:table下都只有一个个单独元素,是值的话直接用string xxSameAsElment来获取好了,有节点的话用bean
3、第三层:有N个相同数据,标注子节点,且用List<String>来获取

@XStreamAlias("updatedata")//类注解(必须写),根节点
public class ZydUpdateDataBean {

    @XStreamImplicit(itemFieldName = "table")//节点注解(必须写),有N个用List
    private List<ZydTableBean> tables;

    public List<ZydTableBean> getTables() {
        return tables;
    }

    public void setTables(List<ZydTableBean> tables) {
        this.tables = tables;
    }

    //2 : 每个table下面可以看到有3个元素
    public static class ZydTableBean{
        String name;
        String field;
        ZydValues values;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getField() {
            return field;
        }

        public void setField(String field) {
            this.field = field;
        }

        public ZydValues getValues() {
            return values;
        }

        public void setValues(ZydValues values) {
            this.values = values;
        }

        //3
        public static class ZydValues{
            @XStreamImplicit(itemFieldName = "value")//节点注解(必须写)
            private List<String> valueList;

            public List<String> getValueList() {
                return valueList;
            }

            public void setValueList(List<String> valueList) {
                this.valueList = valueList;
            }
        }
    }
}
3、支持CDATA的XStream工具编写~~直接Copy来
public class XStreamUtil {
    public static String PREFIX_CDATA = "<![CDATA[";
    public static String SUFFIX_CDATA = "]]>";

    /**
     * 全部转化
     */
    public static XStream initXStream() {
        return new XStream(new XppDriver() {
            @Override
            public HierarchicalStreamWriter createWriter(Writer out) {
                return new PrettyPrintWriter(out) {
                    protected void writeText(QuickWriter writer, String text) {
                        // if (text.startsWith(PREFIX_CDATA) &&
                        // text.endsWith(SUFFIX_CDATA)) {
                        writer.write(PREFIX_CDATA + text + SUFFIX_CDATA);
                        // } else {
                        // super.writeText(writer, text);
                        // }
                    }
                };
            }
        });
    }

    /**
     * 初始化XStream可支持某一字段可以加入CDATA标签,如果需要某一字段使用原文,就需要在String类型的text的头加上
     * "<![CDATA["和结尾处加上"]]>"标签, 以供XStream输出时进行识别
     * @param isAddCDATA 是否支持CDATA标签
     */
    public static XStream initXStream(boolean isAddCDATA) {
        XStream xstream = null;
        if (isAddCDATA) {
            xstream = new XStream(new XppDriver() {
                @Override
                public HierarchicalStreamWriter createWriter(Writer out) {
                    return new PrettyPrintWriter(out) {
                        protected void writeText(QuickWriter writer, String text) {
                            if (text.startsWith(PREFIX_CDATA) && text.endsWith(SUFFIX_CDATA)) {
                                writer.write(text);
                            } else {
                                super.writeText(writer, text);
                            }
                        }
                    };
                }
            });
        } else {
            xstream = new XStream();
        }
        return xstream;
    }
}
4、具体解析
//去掉乱七八糟数据
updateData = updateData.replace("</table>-200","</table>");
//XStream解析器:xml->bean
boolean flag = updateData.contains(XStreamUtil.PREFIX_CDATA);
XStream xStream = XStreamUtil.initXStream(flag);
xStream.processAnnotations(ZydUpdateDataBean.class);
ZydUpdateDataBean dataBean = (ZydUpdateDataBean) xStream.fromXML(updateData);
目录
相关文章
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
264 4
|
2月前
|
Java 开发工具 Android开发
Android与iOS开发环境搭建全解析####
本文深入探讨了Android与iOS两大移动操作系统的开发环境搭建流程,旨在为初学者及有一定基础的开发者提供详尽指南。我们将从开发工具的选择、环境配置到第一个简单应用的创建,一步步引导读者步入移动应用开发的殿堂。无论你是Android Studio的新手还是Xcode的探索者,本文都将为你扫清开发道路上的障碍,助你快速上手并享受跨平台移动开发的乐趣。 ####
|
1月前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
66 6
|
1月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
1月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
2月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
2月前
|
安全 Java Linux
深入解析Android系统架构及其对开发者的意义####
【10月更文挑战第21天】 本文旨在为读者揭开Android操作系统架构的神秘面纱,探讨其如何塑造现代移动应用开发格局。通过剖析Linux内核、硬件抽象层、运行时环境及应用程序框架等关键组件,揭示Android平台的强大功能与灵活性。文章强调了理解Android架构对于开发者优化应用性能、提升用户体验的重要性,并展望了未来技术趋势下Android的发展方向。 ####
64 0
|
3月前
|
开发工具 Android开发 iOS开发
深入解析安卓与iOS开发环境的优劣
【10月更文挑战第4天】 本文将深入探讨安卓和iOS两大主流移动操作系统的开发环境,从技术架构、开发工具、用户体验等方面进行详细比较。通过分析各自的优势和不足,帮助开发者更好地理解这两个平台的异同,从而为项目选择最合适的开发平台提供参考。
40 3
|
2月前
|
安全 5G Android开发
安卓与iOS的较量:技术深度解析
【10月更文挑战第24天】 在移动操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两个系统的技术特点、优势和不足,以及它们在未来可能的发展方向。我们将通过对比分析,帮助读者更好地理解这两个系统的本质和内涵,从而引发对移动操作系统未来发展的深思。
65 0
|
3月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
124 0

热门文章

最新文章

推荐镜像

更多
  • DNS