【问题标题】:How to parse XML using Jackson API?如何使用 Jackson API 解析 XML?
【发布时间】:2018-11-07 20:04:06
【问题描述】:

我正在使用 Jackson api 来解析 xml 对象。

<BESAPI xsi:noNamespaceSchemaLocation="BESAPI.xsd">
    <Employee Resource="https://abc:52311/api/employee/100"/>
    <Employee Resource="https://abc:52311/api/employee/200"/>
    <Employee Resource="https://abc:52311/api/employee/300"/>
    <Employee Resource="https://abc:52311/api/employee/400"/>
</BESAPI>

这是xml记录的结构。我想以字符串形式获取所有资源的列表。如何使用 Jackson api 实现它?

【问题讨论】:

  • 顺便说一句:您的 XML 示例无效,因为它使用了 xsi: 前缀而没有定义它。您需要将xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 添加到BESAPI 根元素中。

标签: java xml rest xml-parsing jackson


【解决方案1】:

首先,您需要编写一些 Java 类来对您的 XML 内容进行建模。 课程获得@JacksonXml... 注解告诉 Jackson XML 和 Java 之间的映射。 当 Java 名称与 XML 名称不同时,这些注释尤其重要。

一个类用于表示&lt;BESAPI&gt; 根元素:

@JacksonXmlRootElement(localName = "BESAPI")
public class BESAPI {

    @JacksonXmlProperty(isAttribute = true, localName = "noNamespaceSchemaLocation", namespace = XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI)
    private String noNamespaceSchemaLocation;

    @JacksonXmlProperty(isAttribute = false, localName = "Employee")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Employee> employees;

    // public getters and setters (omitted here for brevity)
}

以及另一个代表&lt;Employee&gt;元素的类

public class Employee {

    @JacksonXmlProperty(isAttribute=true, localName="Resource")
    private String resource;

    // public getters and setters (omitted here for brevity)
}

那么你就可以使用Jackson的XmlMapper来读取XML内容了。

XmlMapper xmlMapper = new XmlMapper();
File file = new File("example.xml");
BESAPI besApi = xmlMapper.readValue(file, BESAPI.class);
for (Employee employee : besApi.getEmployees()) {
    System.out.println(employee.getResource());
}

【讨论】:

    【解决方案2】:

    SimpleXml 可以做到这一点:

    final String data = ...
    final SimpleXml simple = new SimpleXml();
    final Element element = simple.fromXml(data);
    for (final Element employee : element.children) {
        System.out.println(employee.attributes.get("Resource"));
    }
    

    将输出:

    https://abc:52311/api/employee/100
    https://abc:52311/api/employee/200
    https://abc:52311/api/employee/300
    https://abc:52311/api/employee/400
    

    来自 Maven 中心:

    <dependency>
        <groupId>com.github.codemonstur</groupId>
        <artifactId>simplexml</artifactId>
        <version>1.4.0</version>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2017-02-19
      • 2021-01-25
      • 1970-01-01
      • 2019-09-16
      • 2019-01-16
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多