java - 解析顶部元素包含对象列表的 XML 文档

标签 java xml jaxb jersey

我必须查询多个返回包含一张发票或发票列表的 XML 文件的 URL(我知道哪些 URL 将返回列表,哪些 URL 将仅返回一张发票)。

单个发票的格式(简化):

<?xml version="1.0" encoding="UTF-8"?>
  <invoice>
    <invoice-id>1</invoice-id>
</invoice>

发票列表的格式:

<?xml version="1.0" encoding="UTF-8"?>
<invoices>
  <invoice>
    <invoice-id>1</invoice-id>
  </invoice>
  <invoice>
    <invoice-id>2</invoice-id>
  </invoice>
</invoices>

Jersey 可以自动处理第一个 xml 片段并将其转换为 Java 类:

@XmlRootElement
public class Invoice {
    @XmlElement(name="invoice-id")  
    Integer invoiceId;
}

这是通过以下代码完成的:

GenericType<JAXBElement<Invoice>> invoiceType = new GenericType<JAXBElement<Invoice>>() {};
Invoice invoice = (Invoice) resource.path("invoice_simple.xml").accept(MediaType.APPLICATION_XML_TYPE).get(invoiceType).getValue(); 

以上有效。

现在我想要一个 InvoiceList 对象,如下所示:

@XmlRootElement
public class InvoiceList {
    @XmlElementWrapper(name="invoices")
    @XmlElement(name="invoice")
    List<Invoice> invoices; 
}

这就是我遇到问题的地方; InvoiceList.invoices 在以下情况后保持为空:

GenericType<JAXBElement<InvoiceList>> invoicesType = new GenericType<JAXBElement<InvoiceList>>() {};
InvoiceList invoices = (InvoiceList) resource.path("invoices_simple.xml").accept(MediaType.APPLICATION_XML_TYPE).get(invoicesType).getValue();      
// now invoices.invoices is still null!

我知道 Jersey/JAXB 可以处理对象列表,但如果顶部元素包含列表,它似乎不起作用。

所以,我的问题是:如何指示 Jersey 解析包含发票对象列表的 xml 文件?

最佳答案

第一个答案是

nillable = true 放到 @XmlElement 上。

@XmlElement(name = "invoice", nillable = true)
List<Invoice> invoices; 

我会这样做。 (您不必包装已经包装的集合。)

@XmlRootElement
public class Invoices {

    public List<Invoice> getInvoices() {
        if (invoices == null) {
            invoices = new ArrayList<Invoice>();
        }
        return invoices;
    }

    @XmlElement(name = "invoice", nillable = true)
    private List<Invoice> invoices; 
}

一些 JAX-RS 示例如下

@GET
@Path("/invoices")
public Invoices readInvoices() {
    // ...
}

@GET
@Path("/invoices/{invoice_id: \\d+}")
public Invoice readInvoice(@PathParam("invoice_id") final long invoiceId) {
    // ...
}

关于java - 解析顶部元素包含对象列表的 XML 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13896065/

相关文章:

java - 暂停按钮java

java - 需要正则表达式匹配方面的帮助

java - java.util.Date 和 XMLGregorianCalendar 之间的简单转换

java - 使用 JAXB 读取 xml

java - Spring ,Oauth2 : authentication details lost after refreshing the token

java.net.MalformedURLException : protocol not found in parsing xml from asset folder

java - 将 xml 转换为 csv

c# - 使用 XPATH 在带有命名空间的 XML 中选择节点的问题

java - 如何使用maven从具有通用模式的多个xsd生成java类

java - 如何使用 JAXB 从 Java 中的 XSD 获取 minOccurs/maxOccurs 值?