XStream转换器: 处理xml节点中既有属性又有值

简介: XStream转换器: 处理xml节点中既有属性又有值

1.需处理的数据:

  1. <orderInfo orderName="酸奶" orderType="奶制品" orderPrice="5.00">2</orderInfo>


2.处理xml节点中既有属性又有值,有两种方式

  1. 使用Xstram自带的转换器
  2. 自定义的转换器

3.示例:

3.1.JavaBean实体

  1. package com.newcapec.dao.domain;
  2. import com.thoughtworks.xstream.XStream;
  3. import com.thoughtworks.xstream.annotations.XStreamAlias;
  4. import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
  5. import com.thoughtworks.xstream.annotations.XStreamConverter;
  6. /**
  7. * @version V1.0
  8. * @Title: JavaBean实体
  9. * @ClassName: com.newcapec.dao.domain.enums
  10. * @Description:
  11. * @Copyright2016-2017  - Powered By 研发中心
  12. * @author: 王延飞
  13. * @date:2017/12/278:05
  14. */
  15. @XStreamAlias("orderInfo")
  16. // 自带的转换器
  17. //@XStreamConverter(value=ToAttributedValueConverter.class, strings={"orderNumber"})
  18. // 自定义的转换器
  19. @XStreamConverter(OrderConverter.class)
  20. publicclassOrder {
  21.    @XStreamAsAttribute
  22.    private String orderName;
  23.    @XStreamAsAttribute
  24.    private String orderType;
  25.    @XStreamAsAttribute
  26.    private String orderPrice;
  27. //    @XStreamOmitField
  28.    private String orderNumber;
  29.    publicOrder() {
  30.    }
  31.    publicOrder(String orderName, String orderType, String orderPrice, String orderNumber) {
  32.        this.orderName = orderName;
  33.        this.orderType = orderType;
  34.        this.orderPrice = orderPrice;
  35.        this.orderNumber = orderNumber;
  36.    }
  37.    public String getOrderName() {
  38.        return orderName;
  39.    }
  40.    publicvoidsetOrderName(String orderName) {
  41.        this.orderName = orderName;
  42.    }
  43.    public String getOrderType() {
  44.        return orderType;
  45.    }
  46.    publicvoidsetOrderType(String orderType) {
  47.        this.orderType = orderType;
  48.    }
  49.    public String getOrderPrice() {
  50.        return orderPrice;
  51.    }
  52.    publicvoidsetOrderPrice(String orderPrice) {
  53.        this.orderPrice = orderPrice;
  54.    }
  55.    public String getOrderNumber() {
  56.        return orderNumber;
  57.    }
  58.    publicvoidsetOrderNumber(String orderNumber) {
  59.        this.orderNumber = orderNumber;
  60.    }
  61.    @Override
  62.    public String toString() {
  63.        return"Order{" +
  64.                "orderName='" + orderName + '\'' +
  65.                ", orderType='" + orderType + '\'' +
  66.                ", orderPrice='" + orderPrice + '\'' +
  67.                ", orderNumber='" + orderNumber + '\'' +
  68.                '}';
  69.    }
  70.    publicstaticvoidmain(String[] args) {
  71.        Orderorder=newOrder("酸奶", "奶制品", "5.00", "2");
  72.        XStreamxStream=newXStream();
  73.        xStream.autodetectAnnotations(true);//自动检测注解
  74.        xStream.processAnnotations(Order.class);//应用Person类的注解
  75.        StringtoXML= xStream.toXML(order);
  76.        // 序列化
  77.        System.out.println("【序列化】:"+toXML);
  78.        // 反序列化
  79.        ObjectfromXML= xStream.fromXML("【反序列化】:"+toXML);
  80.        System.out.println(fromXML);
  81.    }
  82. }


3.2.自定义转换器:

  1. package com.newcapec.dao.domain;
  2. import com.thoughtworks.xstream.converters.Converter;
  3. import com.thoughtworks.xstream.converters.MarshallingContext;
  4. import com.thoughtworks.xstream.converters.UnmarshallingContext;
  5. import com.thoughtworks.xstream.io.HierarchicalStreamReader;
  6. import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
  7. /**
  8. * @version V1.0
  9. * @Title:
  10. * @ClassName: com.newcapec.dao.domain
  11. * @Description: 自定义转换器
  12. * @Copyright2016-2017  - Powered By 研发中心
  13. * @author: 王延飞
  14. * @date:2017/12/278:42
  15. */
  16. publicclassOrderConverterimplementsConverter {
  17.    //转换条件
  18.    @Override
  19.    publicbooleancanConvert(Class type) {
  20.        return type.equals(Order.class);
  21.    }
  22.    /**
  23.     * 将java对象转为xml时使用
  24.     */
  25.    @Override
  26.    publicvoidmarshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
  27.        Orderorder= (Order) source;
  28.        writer.addAttribute("orderName", order.getOrderName());
  29.        writer.addAttribute("orderType", order.getOrderType());
  30.        writer.addAttribute("orderPrice", order.getOrderPrice());
  31.        writer.setValue(order.getOrderNumber());
  32.    }
  33.    /**
  34.     * 将xml转为java对象使用
  35.     */
  36.    @Override
  37.    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
  38.        // 在解析order元素时,先创建一个Order对象
  39.        Orderorder=newOrder();
  40.        // 将order元素的name属性设置为Order对象的name属性值
  41.        order.setOrderName(reader.getAttribute("orderName"));
  42.        order.setOrderType(reader.getAttribute("orderType"));
  43.        order.setOrderPrice(reader.getAttribute("orderPrice"));
  44.        // 将order元素的txt值设置为Order对象的value值
  45.        order.setOrderNumber(reader.getValue());
  46.        return order;
  47.    }
  48. }


3.3.输出结果:

  1. 【序列化】:<orderInfo orderName="酸奶" orderType="奶制品" orderPrice="5.00">2</orderInfo>

  2. 【反序列化】:Order{orderName='酸奶', orderType='奶制品', orderPrice='5.00', orderNumber='2'}



目录
相关文章
|
22天前
|
XML 存储 JavaScript
XML DOM - 访问节点
`getElementsByTagName()` 方法用于访问 XML 文档中的特定节点。该方法返回一个节点列表,相当于节点数组,可用来遍历和导航节点树。例如,加载 &quot;books.xml&quot; 到 xmlDoc 后,`x = xmlDoc.getElementsByTagName(&quot;book&quot;)` 将获取所有 `&lt;book&gt;` 节点。
|
8天前
|
XML 存储 JavaScript
XML DOM - 访问节点
`getElementsByTagName()` 方法用于获取 XML 文档中指定标签名的所有节点,返回一个节点列表,类似数组。可以循环遍历节点树或利用节点关系导航来访问每个节点。例如,加载 &quot;books.xml&quot; 到 xmlDoc 后,变量 x 存储了所有 `&lt;book&gt;` 节点的列表。
|
3天前
|
XML JavaScript 数据格式
XML DOM 遍历节点树
Traversal means looping or moving through a node tree in XML DOM. &quot;Traversal of the node tree&quot; often occurs when extracting each element&#39;s value from an XML document. Here&#39;s an example that loops through all child nodes of an `xmlDoc` and displays their names and values:
|
4天前
|
XML 存储 JavaScript
XML DOM - 访问节点
DOM 允许访问 XML 文档的每个节点, 主要通过三种方式: 1. 使用 `getElementsByTagName()` 方法; 2. 循环遍历节点树; 3. 利用节点间关系导航。 此方法返回一个节点列表(Node List),实质为节点数组。示例代码加载 &quot;books.xml&quot; 到 `xmlDoc`,并存储结果到变量 `x`。
|
5天前
|
XML JavaScript 数据格式
XML DOM 遍历节点树
该文介绍了如何遍历XML文档的节点树。通过循环移动,可以访问并处理每个节点,例如提取元素值。示例代码展示了一个实例,它加载XML字符串到xmlDoc,然后遍历根元素的所有子节点,打印出节点名及文本值。在浏览器中运行此实例会显示标题、作者和年份等信息。
|
6天前
|
XML 存储 JavaScript
XML DOM - 访问节点
`getElementsByTagName()` 方法用于访问XML文档中的特定节点。节点可按三种方式获取:使用该方法、遍历节点树或导航节点关系。`getElementsByTagName()` 返回一个节点列表,类似数组,可用于处理多个匹配节点。例如,代码加载 &quot;books.xml&quot; 到 `xmlDoc`,再将结果保存到变量 `x`。
|
10天前
|
XML 存储 JavaScript
XML DOM - 访问节点
`getElementsByTagName()` 方法用于访问XML文档中的特定节点。节点可按三种方式获取:使用该方法、遍历节点树或导航节点关系。`getElementsByTagName()` 返回一个节点列表,类似数组,可用于处理多个匹配节点。例如,代码加载 &quot;books.xml&quot; 到 `xmlDoc`,再将结果保存到变量 `x`。
|
7天前
|
XML JavaScript 数据格式
XML DOM 遍历节点树
该文介绍了如何遍历XML文档的节点树。通过循环移动,可以访问并处理每个节点,例如提取元素值。示例代码展示了一个实例,它加载XML字符串到`xmlDoc`,遍历根元素的所有子节点,打印出节点名及文本值,如&quot;title: Everyday Italian&quot;等。
|
12天前
|
XML JavaScript 数据格式
XML DOM 遍历节点树
该文介绍了XML DOM遍历节点树的概念,通过循环或移动在节点树中操作。示例展示了如何遍历XML文档,提取每个元素的名称和值。代码实例遍历了一个XML结构,输出了`book`元素的子节点信息,如`title`, `author`, `year`及其对应的值。
|
12天前
|
XML 存储 JavaScript
XML DOM - 访问节点
`getElementsByTagName()` 方法用于访问 XML 文档中的特定节点。该方法返回一个包含匹配标签名的所有节点的节点列表。可以遍历这个列表,或者利用节点间的父子、兄弟关系在树中导航。例如,加载 &quot;books.xml&quot; 到 xmlDoc 后,变量 x 保存了所有 `&lt;book&gt;` 节点的节点列表。节点列表类似数组,可按索引访问。