使用XStream lib,我的.xml结构应该如下:
<record>value1</record>
...
<record>valueN</record>
<tailRecord>recordsCount</tailRecord>
tailRecord
是整个.xml文件的最后一个标记
它应该保持record
的数量,因此应该可以计算。
是否可以使用XStream提供可计算的标签?
通用用例如下:
执行用户操作时,record
应添加,tailRecord
值应为updated
。
答案 0 :(得分:1)
您需要对架构进行微调。而不是:
<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以使用this示例演示的@XStreamOmitField
注释完全忽略它。
我的论点是,正确的OOD永远不会允许对象包含事物列表,并且具有表示列表大小的单独属性(recordCount
)。你只需要设计一个对象(比如我上面的例子)就可以得到这些东西的列表,并且最多只有一个方便的方法,如getRecordCount()
,可以在运行时返回列表的大小。
我理解由于其他原因(与遗留系统等接口),你可能需要tailRecord
个元素,但是团队通过XStream并成为一个真正的Java对象,就是没有在Java Land中很好地使用它。
而且,如果由于某种原因我不明白你的问题,这不是你想要的答案,我的最后一个建议是查看Smooks。 Smooks实现了Visitor
接口,并允许您在每次内部SAXParser访问XML节点时执行自定义处理。您可以将其配置为每当达到tailRecord
时运行计数方法,并总结您想要的计数。祝你好运!