当前位置: 首页 > 面试题库 >

如何使用@XmlElement注释列表?

杜轩昂
2023-03-14
问题内容

我使用以下注释javax.xml.bind.annotation.XmlElement

@XmlElement         
public List<String> getKeywords() {
    return keywords;
}

当我整理一些示例内容时,它将生成以下XML:

<keywords>keyword1</keywords>
<keywords>keyword2</keywords>

我想获取以下XML:

<keywords>
    <keyword>keyword1</keyword>
    <keyword>keyword2</keyword>
</keywords>

我应该使用哪种注释?

我试过了

@XmlElementWrapper
@XmlElement(name="keyword")

但是,整个内容消失了,结果是:

<keywords/>

如果仅尝试重命名元素,也会发生相同的情况:

@XmlElement(name="keyword")

我究竟做错了什么?

更新:

这是根据第一个答案更新的类的完整代码,但仍无法正常工作(将其<keywords/>编组为XML时,结果为空列表):

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

@XmlRootElement
public class Content {

    private List<String> keywords;

    public Content() {}

    @XmlElementWrapper(name="keywords")
    @XmlElement(name="keyword")
    public List<String> getKeywords() {
        return keywords;
    }

    public void setKeywords(List<String> keywords) {
        this.keywords = keywords;
    }

}

我也尝试了以下相同的结果:

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

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Content {

    @XmlElementWrapper(name="keywords")
    @XmlElement(name="keyword")
    private List<String> keywords;

    public Content() {}

    public List<String> getKeywords() {
        return keywords;
    }

    public void setKeywords(List<String> keywords) {
        this.keywords = keywords;
    }

}

但是,关键字不为空,如下所示,<keywords>keyword1</keywords><keywords>keyword2</keywords>而不是一个空列表:

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

@XmlRootElement
public class Content {

    private List<String> keywords;

    public Content() {}

    @XmlElement
    public List<String> getKeywords() {
        return keywords;
    }

    public void setKeywords(List<String> keywords) {
        this.keywords = keywords;
    }

}

编组的代码是(JAX-RS):

import java.io.StringWriter;
import javax.ws.rs.Consumes;
import html" target="_blank">javax.ws.rs.Path;
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

@Path("process")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_XML)
public class ContentHandler {

    @POST
    public Response process(Content content) {

        StringWriter stringWriter = new StringWriter();
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(Content.class);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            jaxbMarshaller.marshal(content, stringWriter);
        } catch (JAXBException e) {
            return Response.serverError().entity(e.getMessage()).build();
        }
        return Response.ok(stringWriter.toString(), MediaType.APPLICATION_XML).build();       
    }

}

问题答案:

您需要利用@XmlElementWrapper@XmlElement

Java模型

内容

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

@XmlRootElement
public class Content {

    private List<String> keywords;

    public Content() {}

    @XmlElementWrapper
    @XmlElement(name="keyword")
    public List<String> getKeywords() {
        return keywords;
    }

    public void setKeywords(List<String> keywords) {
        this.keywords = keywords;
    }

}

示范代码

演示版

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

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Content.class);

        List<String> strings = new ArrayList<String>(2);
        strings.add("foo");
        strings.add("bar");

        Content content = new Content();
        content.setKeywords(strings);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(content, System.out);
    }

}

输出量

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<content>
    <keywords>
        <keyword>foo</keyword>
        <keyword>bar</keyword>
    </keywords>
</content>

想要查询更多的信息

以下是我博客中几篇文章的链接,这些文章提供了更多信息:

  • http://blog.bdoughan.com/2010/09/jaxb-collection-properties.html
  • http://blog.bdoughan.com/2012/12/jaxb-representing-null-and-empty.html


 类似资料:
  • 在编译过程中,我遇到一个错误:“注释类型不适用于这种声明”。和细节: 我使用JDK 1.6.18和@XmlElement在这个版本中不可用。我发现JAXB(它的版本)中的主要问题。它在这里被讨论: XmlElement注释用WebParam脱盐 是否可以替换JAXB实现在JavaJRE 1.6 SE中的版本?。 我使用认可的方法($JAVA_HOME/lib/认可)更新了JDK中的JAXB,但它仍

  • 我正在创建一个REST-API与泽西。为此,我正在学习PluralSight课程。 我已经安装了Jersey 2.2和Jersey media moxy依赖项(v2.26)。我将返回以下资源以将其解析为JSON: 如果我输出XML(使用@products(MediaType.APPLICATION_XML)),则“getNaam”的属性将正确地重命名为“name”,而不是“naam”。当我输出JS

  • 问题内容: 如何在React组件的方法内部使用注释? 我有以下组成部分: 我的评论显示在用户界面中。 在组件的渲染方法中应用单行和多行注释的正确方法是什么? 问题答案: 因此,在方法内允许使用注释,但为了在JSX中使用它们,必须将它们用大括号括起来并使用多行样式的注释。 您可以在此处阅读有关注释如何在JSX中工作的更多信息

  • 问题内容: 我想获得应用程序中带有注释的类的完整列表。此操作的最佳机制是什么? ps。例如,JAX-RS实现如何找到所有带有注释的类?我想使用相同的机制。 问题答案: 通常,这是通过称为类路径扫描的过程完成的。通常,类加载器不允许扫描类路径上的所有类。但是通常唯一使用的类加载器是我们可以从中检索目录和jar文件的列表(请参阅getURLs),然后一个个地打开它们以列出可用的类。 这种方法由Scan

  • 我需要将XML内容绑定到pojo的String属性,为此我创建了自定义DomHandler来提取所需的部分,如下所示 将映射到pojo 我使用XSD生成我的POJO,并且我有几个自定义注释要添加到生成的POJO中,因此我使用maven-jaxb2-plugin。 问题是,它会根据需要添加注释以及与@xmlanyement互斥的@xmlement,有没有办法避免使用XSD添加@xmlement注释?

  • 我通过web服务接收XML,并使用XmlElement注释将XML解析为Java。下面是我如何使用注释。请让我知道我是否正确使用它们。我对int领域特别感兴趣。它似乎起作用了,但我觉得我没有正确地使用注释。我看到了许多类似于@xmlelement(name=“something”type=integer.class)的示例。XmlJavaTypeAdapter注释中是否也建议使用此类型属性?我为这