gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:34:11 26 4
gpt4 key购买 nike

我必须查询多个返回包含一张发票或发票列表的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com