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

参考

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XStream是一个Java库,用于将Java对象序列化为XML格式,并反过来将XML转换Java对象。使用XStream可以方便地将XML文件转换Java对象。 以下是一个示例,演示如何使用XStreamXML文件转换Java对象: 1. 创建Java类以表示XML中的元素 例如,假设我们有以下XML文件: ``` <book> <title>Java Programming</title> <author>John Smith</author> <publisher>ABC Publishing</publisher> </book> ``` 我们可以创建一个Java类来表示这个XML元素: ``` public class Book { private String title; private String author; private String publisher; // getters and setters } ``` 2. 创建XStream对象并配置 可以创建一个XStream对象来执行XMLJava对象转换。要配置XStream,我们需要告诉它如何将XML元素映射到Java对象的属性。 例如,我们可以使用以下代码来配置XStream: ``` XStream xstream = new XStream(); xstream.alias("book", Book.class); xstream.useAttributeFor(Book.class, "title"); xstream.useAttributeFor(Book.class, "author"); xstream.useAttributeFor(Book.class, "publisher"); ``` 在这里,我们使用`alias()`方法将XML元素“book”映射到Java类`Book`。然后,我们使用`useAttributeFor()`方法告诉XStreamXML元素的属性映射到Java对象的属性。在我们的例子中,XML元素的子元素将映射到Java对象的属性(因为我们没有使用`useAttributeFor()`方法)。 3. 从XML文件创建Java对象 现在我们已经配置了XStream,我们可以使用它来将XML文件转换Java对象。以下是一个示例: ``` File file = new File("book.xml"); Book book = (Book) xstream.fromXML(file); ``` 在这里,我们使用`fromXML()`方法将XML文件转换Java对象。该方法将返回一个Object对象,我们需要将其转换为我们的Java类(在我们的例子中是`Book`)。 通过这些步骤,我们可以方便地将XML文件转换Java对象,以便在Java应用程序中使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值