对象嵌套转化为XML

对象嵌套转化为XML
1. 简单对象嵌套
Order实体类:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Order {
    private Integer id;
    private Double price;
    private Product product;

    ...... get/set 方法
}

Product实体类:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Product {
    @XmlAttribute
    private Integer id;
   
    private String name;

    ...... get/set 方法
}

生成XML方法:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

public class testOrderDemo {
    public static void main(String[] args) throws JAXBException {
        Product p = new Product();
        p.setId(1);
        p.setName("Apple");
        Order order = new Order();
        order.setId(1);
        order.setPrice(23.45);
        order.setProduct(p);
        JAXBContext context = JAXBContext.newInstance(Order.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(order, System.out);
    }
}

XML结果:

2. 含有List类型对象
Product实体类:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.annotation.*;
import java.util.List;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Product {
    @XmlAttribute
    private Integer id;
    
    private String name;

    ...... get/set方法
}

(1)循环数据不被包裹
Order2实体类:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement
public class Order2 {
    private Integer id;
    private Double price;
    private List<Product> product;

    ...... get/set 方法
}

生成XML方法:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.util.Arrays;
import java.util.List;

public class testOrderDemo2 {
    public static void main(String[] args) throws JAXBException {
        Product p1 = new Product();
        p1.setId(1);
        p1.setName("Apple");
        Product p2 = new Product();
        p2.setId(2);
        p2.setName("Banana");
        List<Product> list = Arrays.asList(p1,p2);
        Order2 order = new Order2();
        order.setId(1);
        order.setPrice(45.67);
        order.setProduct(list);
        JAXBContext context = JAXBContext.newInstance(Order2.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(order, System.out);
    }
}

XML结果:


(2)循环数据被包裹
Order3实体类:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Order3 {
    private Integer id;
    private Double price;
    @XmlElementWrapper(name = "Products")
    private List<Product> product;

    ...... get/set 方法
}

在实体类中的List属性上面添加@XmlElementWrapper时必须在该类上添加@XmlAccessorType(XmlAccessType.FIELD)注解,否则会报下面异常:

生成XML方法:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.util.Arrays;
import java.util.List;

public class testOrderDemo3 {
    public static void main(String[] args) throws JAXBException {
        Product p1 = new Product();
        p1.setId(1);
        p1.setName("Apple");
        Product p2 = new Product();
        p2.setId(2);
        p2.setName("Banana");
        List<Product> list = Arrays.asList(p1,p2);
        Order3 order = new Order3();
        order.setId(1);
        order.setPrice(45.67);
        order.setProduct(list);
        JAXBContext context = JAXBContext.newInstance(Order3.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(order, System.out);
    }
}

XML结果:

3. 简单动态XML
(1)生成的XML只包含指定数据的字段.如果不指定数据,就能生成不一样的XML
Product实体类:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.annotation.*;
import java.util.List;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Product {
    @XmlAttribute
    private Integer id;
    
    private String name;

    ...... get/set 方法
}

Order3实体类:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Order3 {
    private Integer id;
    private Double price;
    @XmlElementWrapper(name = "Products")
    private List<Product> product;

    ...... get/set 方法
}

生成XML方法:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.util.Arrays;
import java.util.List;

public class testOrderDemo4 {
    public static void main(String[] args) throws JAXBException {
        Product p1 = new Product();
        p1.setId(1);
        Product p2 = new Product();
        p2.setId(2);
        p2.setName("Banana");
        List<Product> list = Arrays.asList(p1,p2);
        Order3 order = new Order3();
        order.setId(1);
        order.setPrice(45.67);
        order.setProduct(list);
        JAXBContext context = JAXBContext.newInstance(Order3.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(order, System.out);
    }
}

XML结果:


(2)动态XML Element
有时候,Products元素下面并不只是加入product,可能动态加入各种商品.这次模拟的商品是糕点与饼干.
需要注意的是@XmlRootElement注解不能少.
Cake实体类:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "Cake")
public class Cake {
    private Integer id;
    private String name;

    ...... get/set 方法
}

Biscuit实体类:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "Biscuit")
public class Biscuit {
    private Integer id;
    private String name;

    ...... get/set 方法
}

Order的第三个字段是List,但是没有指定一个特定对象,用了Object代指所有,还有一个@XmlAnyElement是最重要的注解,用来标注所有的Element
Order4实体类:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.annotation.*;
import java.util.List;

@XmlRootElement(name = "Order")
@XmlAccessorType(XmlAccessType.FIELD)
public class Order4 {
    private Integer id;
    private Double price;
    @XmlElementWrapper(name = "Products")
    @XmlAnyElement
    private List<Object> product;

    ...... get/set 方法
}

生成XMl方法:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.util.Arrays;
import java.util.List;

public class testOrderDemo5 {
    public static void main(String[] args) throws JAXBException {
        Cake cake = new Cake();
        cake.setId(1);
        cake.setName("Nobel");
        Biscuit biscuit = new Biscuit();
        biscuit.setId(2);
        biscuit.setName("PB");
        List<Object> list = Arrays.asList(cake,biscuit);
        Order4 order = new Order4();
        order.setId(1);
        order.setProduct(list);
        JAXBContext context = JAXBContext.newInstance(Order4.class, Cake.class, Biscuit.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(order, System.out);
    }
}

XML结果:

(3)XML动态Attribute
动态Element对应的是Attribute,不过需要注意的是动态Attribute需要的是Map,而且其key的类型需要指定为QName,这个QName在复杂的XML生成时有很大用处.一般使用到的是其QName(name),它还有一个形式为QName(name,namespace),可以指定命名空间,在某些场景下有不可替代的作用.
Product实体类:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Product {
    @XmlAttribute
    private Integer id;
    
    private String name;

    ...... get/set 方法
}

Order5实体类:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.namespace.QName;
import java.util.Map;

@XmlRootElement(name = "Order")
@XmlAccessorType(XmlAccessType.FIELD)
public class Order5 {
    @XmlAnyAttribute
    private Map<QName, String> properties;
    private Product product;

    ...... get/set方法
}

生成XMl方法:

package com.liantuo.contrast.util.jaxb;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import java.util.HashMap;
import java.util.Map;

public class testOrderDemo6 {
    public static void main(String[] args) throws JAXBException {
        Product p = new Product();
        p.setId(1);
        p.setName("Apple");
        Map<QName, String> map = new HashMap<>();
        map.put(new QName("id"), "1105");
        map.put(new QName("classification"), "food");
        map.put(new QName("type"), "fruit");
        Order5 order = new Order5();
        order.setProduct(p);
        order.setProperties(map);
        JAXBContext context = JAXBContext.newInstance(Order5.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(order, System.out);
    }
}

XML结果:

在Python中,你可以通过使用标准库中的`json`模块来解析JSON文件,然后使用`xml.etree.ElementTree`模块来将解析得到的数据结构转换为XML格式。以下是一个简单的步骤说明,以及一个代码示例: 步骤说明: 1. 使用`json`模块的`json.load()`或`json.loads()`函数来加载JSON文件或JSON字符串。 2. 构建一个与目标XML结构对应的Python对象(通常是树状结构)。 3. 使用`xml.etree.ElementTree`模块中的函数和类来创建XML元素并构建树状结构。 4. 将构建好的XML树输出为文件。 代码示例: ```python import json import xml.etree.ElementTree as ET # 假设有一个名为data.json的JSON文件 with open('data.json', 'r') as json_file: data = json.load(json_file) # 创建根节点 root = ET.Element("root") # 遍历JSON数据并构建XML def build_xml(node, parent): if isinstance(node, dict): for tag, child in node.items(): subnode = ET.SubElement(parent, tag) build_xml(child, subnode) elif isinstance(node, list): for item in node: subnode = ET.SubElement(parent, 'item') build_xml(item, subnode) else: parent.text = str(node) # 开始构建XML build_xml(data, root) # 将XML写入文件 tree = ET.ElementTree(root) tree.write('output.xml', encoding='utf-8', xml_declaration=True) ``` 请注意,这个示例假设了JSON数据是一个嵌套的字典或列表结构,因此它适用于这种格式的转换。如果你的JSON结构更复杂,你可能需要调整构建XML的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值