XStream:为整个.xml提供可计算的单个标记

时间:2011-10-31 09:14:39

标签: xml serialization tags xstream

使用XStream lib,我的.xml结构应该如下:

<record>value1</record>
         ...
<record>valueN</record>
<tailRecord>recordsCount</tailRecord>

tailRecord是整个.xml文件的最后一个标记  它应该保持record的数量,因此应该可以计算。

是否可以使用XStream提供可计算的标签?
通用用例如下:
执行用户操作时,record添加tailRecord值应为updated

1 个答案:

答案 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时运行计数方法,并总结您想要的计数。祝你好运!