您需要对架构进行细微调整。而不是:
<record>value1</record>
<record>value2</record>
...
<record>valueN</record>
<tailRecord>recordsCount</tailRecord>
你需要:
<records>
<record>value1</record>
<record>value2</record>
...
<record>valueN</record>
</records>
<tailRecord>recordsCount</tailRecord>
...那么,如果您的对象看起来像这样:
public class RecordObject
{
private List<Integer> records;
// ... a bunch of code
public List<Integer> getRecords()
{
return records;
}
public int getRecordSize()
{
return records.size();
}
}
那么你只需要两行XStream:
XStream xstream = new XStream();
RecordObject recordObject = (RecordObject)xstream.fromXML("your-xml-example-as-a-string");
XStream 将(默认情况下)检测<record>value1</record> 是int 类型的节点(或String,或任何其他明显的原始类型)。然后它将多个 <record> 对象捆绑到适当的自动装箱类型的 java.utils.collections.List 中。
然后您就可以像往常一样使用您的RecordObject:
System.out.println("There were " recordObject.getRecordCount() + " records found.");
注意:tailRecord XML 元素可能存在问题。我建议删除它或将 XStream 配置为使用 @XStreamOmitField 注释完全忽略它,就像 this 示例演示的那样。
我的论点是,正确的 OOD 绝不会允许对象包含事物列表,并具有表示列表大小的单独属性 (recordCount)。您只需设计一个对象(如我上面的示例)以包含这些内容的列表,并且最多可以使用 getRecordCount() 之类的便捷方法来在运行时返回列表的大小。
我知道由于其他原因(与遗留系统接口等),您可能需要在其中使用 tailRecord 元素,但团队通过 XStream 并成为真正的 Java 对象,没有什么用处为它在 Java Land 中。
而且,如果由于某种原因我不理解您的问题并且这不是您要寻找的答案,我最后的建议是查看Smooks。 Smooks 实现了Visitor 接口,并允许您在其内部 SAXParser 每次访问 XML 节点时执行自定义处理。您可以将其配置为在达到tailRecord 时运行计数方法,并根据您的需要汇总计数。祝你好运!