我需要从XML结构中解组多个对象,如下所示:
<Control>
<TotalCompanies>2</TotalCompanies>
<TotalSales>100</TotalSales>
<Company>
<Name>ACME Ca</Name>
<TotalSales>70</TotalSales>
<TotalSalesPeople>2</TotalSalesPeople>
<SalesPeople>
<SalesPerson>
<Name>John</Name>
<Sales>40</Sales>
</SalesPerson>
<SalesPerson>
<Name>Joe</Name>
<Sales>30</Sales>
</SalesPerson>
</SalesPeople>
</Company>
<Company>
<Name>ACME Va</Name>
<TotalSales>30</TotalSales>
<TotalSalesPeople>1</TotalSalesPeople>
<SalesPeople>
<SalesPerson>
<Name>Janet</Name>
<Sales>30</Sales>
</SalesPerson>
</SalesPeople>
</Company>
</Control>
我需要能够单独解组一个只包含总数而不是它的子项的Control对象,同样我需要在层次结构的其他层面做同样的事情。理想情况下,我的bean看起来像这样:
class Control {
int totalCompanies;
int totalSales;
}
class Company {
String name;
int totalSales;
int totalSalesPeople;
}
class SalesPerson {
String name;
int sales;
}
我在Spring Batch的上下文中这样做,但我很确定这并不重要。如果我重新构建一些XML,那么我可以让它工作(我很确定我不会被允许重构XML)。也就是说,如果对象没有嵌套,那就没问题了。同样,我可以很容易地让所有的SalesPeople出来。
我也可以将整个树作为对象,这在某些情况下可能会起作用。但是,实际传入的文件可能比可用内存大,因此在实践中不会起作用。
有没有办法让JAXB或其他一些开箱即用的unmarshaller这样做,或者我只需要根据SAX或STAX自行滚动?
编辑:
系统正在使用Spring Batch读取大量传入文件。文件不是如上所述(域不同),但结构是相同的。架构方向是尝试使用开箱即用的阅读器(例如StaxEventItemReader)和解组器(例如Jaxb2Marshaller)。
系统将在我们无法保证有足够内存将整个文件保存在内存中的环境中运行。
我有方法(自定义Stax阅读器/预处理文件/请求XSD更改)工作,但我想确保我没有错过标准阅读器/ unmarshaller实现中可能使用的功能这项工作很容易开箱即用。