当前位置: 首页 > 知识库问答 >
问题:

解析XML字符串到类对象

李睿
2023-03-14

我有这样一个XML字符串:

<?xml version="1.0" encoding="UTF-8" standalone="yes">
<Result xmlns="http://example.com/entities">
  <published>2022-02-17T14:26:54.000+01:00</published>
  <Id>10</Id>
  <QueryResults>
    <Id>11</Id>
    <created>2022-02-17T12:15:54.000+01:00</created>
  </QueryResults>
  <QueryResults>
    <Id>12</Id>
    <created>2022-02-17T12:16:54.000+01:00</created>
  </QueryResults>
</Result>
public class ResultModel {
  @JsonProperty("Id")
  private int id;
  @JsonProperty("published")
  private Date published;
  @JsonProperty("QueryResults")
  private List<QueryResult>

  // GETTERS and SETTERS
}

public class QueryResult {
  @JsonProperty("Id")
  private int id;
  @JsonProperty("created")
  private Date created;
}

当我试图将字符串读入这样的对象时

try {
  com.fasterxml.jackson.dataformat.xml.XmlMapper mapper = new XmlMapper();
  ResultModel obj = mapper.readValue(xmlString, ResultModel.class)
} catch (JsonProcessingException e) {
  e.printStackTrace();
}

我得到以下错误:

com.fasterxml.jackson.databind.exc.MisMatchedInputException: Cannot construct instance of `a.b.c.d.ResultModel` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ("11")
  at [Source: (StringReader); line 1, column 15] (through reference chain: a.b.c.d.ResultModel["QueryResults"]->java.util.ArrayList[0]

我在类中使用@JsonProperty是因为@XmlElement还有其他问题。如果我在ResultModel类中排除字段QueryResults,那么字符串的解析工作正常,看起来是正确的。我做错了什么?我对Java中XML字符串的解析非常陌生,所以我希望有一些简单的方法来解决这个问题。。。

共有1个答案

陆栋
2023-03-14

您需要使用以下2个注释:

    @JacksonXmlElementWrapper(useWrapping=false)
    @JacksonXmlProperty(localName = "QueryResults")
@Data
static class ResultModel {
    @JsonProperty("Id")
    private int id;
    @JsonProperty("published")
    private Date published;

    @JacksonXmlElementWrapper(useWrapping=false)
    @JacksonXmlProperty(localName = "QueryResults")
    private List<QueryResult> queryResult;

}

@Data
static class QueryResult {
    @JsonProperty("Id")
    private int id;
    @JsonProperty("created")
    private Date created;
}

public static void main(String[] argz) throws JsonProcessingException {

    String xml = "<Result>\n"
            + "  <published>2022-02-17T14:26:54.000+01:00</published>\n"
            + "  <Id>10</Id>\n"
            + "  <QueryResults>\n"
            + "    <Id>11</Id>\n"
            + "    <created>2022-02-17T12:15:54.000+01:00</created>\n"
            + "  </QueryResults>\n"
            + "  <QueryResults>\n"
            + "    <Id>12</Id>\n"
            + "    <created>2022-02-17T12:16:54.000+01:00</created>\n"
            + "  </QueryResults>\n"
            + "</Result>";

    XmlMapper mapper = new XmlMapper();
    ResultModel obj = mapper.readValue(xml, ResultModel.class);
    System.out.println(obj);

}

控制台:

ResultModel(id=10, published=Thu Feb 17 14:26:54 CET 2022, queryResult=[QueryResult(id=11, created=Thu Feb 17 12:15:54 CET 2022), QueryResult(id=12, created=Thu Feb 17 12:16:54 CET 2022)])

更新:

当使用Jackson注释时,列表和数组默认情况下是包装的,但是当使用JAXB注释时是未包装的(如果支持,请参阅下文)@JacksonXmlElementWrapper.use包装可以设置为'false'以禁用包装JacksonXmlModule.setDefaultUseWrapper()可用于指定是否使用"包装"或"未包装"设置是默认设置

https://github.com/FasterXML/jackson-dataformat-xml#known-局限性

 类似资料:
  • 问题内容: 您如何解析存储在Java字符串对象中的xml? Java的XMLReader仅从URI或输入流中解析XML文档。无法从包含xml数据的字符串进行解析? 现在,我有以下内容: 在我的处理程序上,我有这个: 提前致谢 问题答案: 该SAXParser的可以读取的的InputSource。 一个 InputSource的 可以采取 读者 在其构造 因此,您可以通过StringReader来解

  • 问题内容: 我有一个字符串,其内容是XML。我想将标签分开,并使其成为Java中的字符串列表。以下是我正在尝试的东西: 我想将其分为以下列表: 我试图通过JAXB处理器执行此操作,但效果不佳。还使用split尝试了一些愚蠢的逻辑,但这也无济于事。还有其他方法可以做到这一点吗? 问题答案:

  • 我想把字符串xml转换成对象类型类。因为我有一个返回对象类型的rest服务。因为我需要根据响应字符串将响应作为动态创建的xml返回。但是,当我试图将字符串xml转换为对象类时,它显示了以下错误: UnmarshalException:意外元素

  • 我必须在JAXB中将xml解析为字符串对象。但是如何为这个xml创建对象 Country.xml 为了解析这个xml,我创建了一个类来映射对象,它创建对象并在控制台中打印出来。却不知道自己做错了什么。 当我运行程序时,我会得到 com . sun . XML . internal . bind . v2 . runtime . illegalanotationexception:illegalan

  • 问题内容: 我有一个 变量字符串 ,其中包含格式正确且有效的XML。我需要使用JavaScript代码来解析此供稿。 如何使用(浏览器兼容)JavaScript代码来完成此操作? 问题答案: Internet Explorer和基于Mozilla的浏览器为XML解析提供了不同的对象,因此明智的是使用jQuery之类的JavaScript框架来处理跨浏览器的差异。 一个非常基本的例子是: 注:如评论

  • 是否有一个内置的javascript函数可以解析: 到 或者我必须为此编写自定义函数吗?