java开发日常之XML字符格式转java对象

本文介绍开发日常中遇到的将xml节点内容转换成java对象

问题

最近对接一个外部接口,接口中将文件信息以类似xml格式的形式通过某个字段返回,具体如下字段的字符串如下,我们需要从其中的节点取出对应的信息封装到java对象

<data>
    <_result>
        <Item>
            <?xml version="1.0" encoding="UTF-8"?>
            <Data>
                <FileContent>ABCDdsads</FileContent>
                <object_name>20230830100001082565.pdf</object_name>
            </Data>
        </Item>
    </_result>
</data>

解决

1、maven依赖需要添加

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>

2、相关知识

有几个关键的注解

@XmlRootElement:用于类上,表示该类是一个可以映射为XML文档的根元素。
@XmlElement:用于类上,表示该类是一个可以映射为XML文档的根元素。
@XmlTransient:用于类、字段和方法上,表示JAXB在映射XML元素时忽略被注解的类、字段、get/set对应字段。
@XmlAccessorType:用于包和类级别上,表示控制字段是否被默认序列化。

3、测试代码

下列是代码编写,可以直接运行但是还是会提示错误

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

public static void main(String[] args) {


        String xmlString = "<data><_result><Item><?xml version=\"1.0\" encoding=\"UTF-8\"?><Data><FileContent>ABCD</FileContent><object_name>20230830100001082565.pdf</object_name></Data></Item></_result></data>";
//        String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><data><_result><Item><Data><FileContent>ABCD</FileContent><object_name>20230830100001082565.pdf</object_name></Data></Item></_result></data>";

        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(Data1.class);
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            StringReader reader = new StringReader(xmlString);
            Data1 data1 = (Data1) jaxbUnmarshaller.unmarshal(reader);
            System.out.println(data1);
            System.out.println(JSON.toJSONString(data1));
            // Now you can access the data in the 'data' object.
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

    @ToString
    @Setter
    @XmlRootElement(name = "data")
    public static class Data1 {
        @XmlElement(name = "_result")
        private Result1 result;
    }

    @ToString
    @Setter
    public static class Result1 {
        @XmlElement(name = "Item")
        private Item item;
    }

    @ToString
    @Setter
    public static class Item {
        @XmlElement(name = "Data")
        private Data data;
    }

    @ToString
    @Setter
    public static class Data {
        @XmlElement(name = "FileContent")
        private String fileContent;
        @XmlElement(name = "object_name")
        private String objectName;
    }

执行结果
执行上面的代码会抛异常
javax.xml.bind.UnmarshalException- with linked exception:
[org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 27; 不允许有匹配 “[xX][mM][lL]” 的处理指令目标。]

错误原因分析:
问题在于XML字符串中标签内部包含了一个XML声明(<?xml version="1.0" encoding="UTF-8"?>)。XML声明应该只出现在XML文档的开始,不能在文档的中间部分。

解决办法:
只需要将XML声明移动到XML字符串的开始,或者完全删除它。以下是修改后的XML字符串:

String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><data><_result><Item><Data><FileContent>ABCD</FileContent><object_name>20230830100001082565.pdf</object_name></Data></Item></_result></data>";

或者

String xmlString = "<data><_result><Item><Data><FileContent>ABCD</FileContent><object_name>20230830100001082565.pdf</object_name></Data></Item></_result></data>";

这样修改后,代码就能正常运行了。
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用JAXB(Java Architecture for XML Binding)来实现XML字符串和Java对象之间的转换。 1. 将Java对象转换XML字符串 使用JAXB的Marshaller类可以将Java对象转换XML字符串。以下是一个示例代码: ```java // 创建JAXBContext对象 JAXBContext jaxbContext = JAXBContext.newInstance(Student.class); // 创建Marshaller对象 Marshaller marshaller = jaxbContext.createMarshaller(); // 设置Marshaller的属性 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 将Java对象转换XML字符串 Student student = new Student("Tom", 18); StringWriter writer = new StringWriter(); marshaller.marshal(student, writer); String xmlString = writer.toString(); System.out.println(xmlString); ``` 2. 将XML字符转换Java对象 使用JAXB的Unmarshaller类可以将XML字符转换Java对象。以下是一个示例代码: ```java // 创建JAXBContext对象 JAXBContext jaxbContext = JAXBContext.newInstance(Student.class); // 创建Unmarshaller对象 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); // 将XML字符转换Java对象 String xmlString = "<student><name>Tom</name><age>18</age></student>"; StringReader reader = new StringReader(xmlString); Student student = (Student) unmarshaller.unmarshal(reader); System.out.println(student.getName() + ", " + student.getAge()); ``` 需要注意的是,在将Java对象转换XML字符串和将XML字符转换Java对象时,都需要先创建JAXBContext对象。JAXBContext是线程安全的,因此建议在应用程序启动时创建一次即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值