Вам нужно будет внести незначительные изменения в вашу схему. Вместо:
<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
, например , в этом примере .
Мой аргумент в пользу этого заключается в том, что собственно OOD никогда не позволит объекту содержать список вещей и иметь отдельное свойство, представляющее размер списка (recordCount
). Вы бы просто спроектировали объект (как мой пример выше), чтобы иметь список этих вещей и иметь - самое большее - удобный метод, такой как getRecordCount()
, чтобы возвращать размер списка во время выполнения.
Я понимаю, что по другим причинам (взаимодействие с унаследованными системами и т. Д.) Вам может понадобиться этот элемент tailRecord
, но командой он проходит через XStream и становится истинным Java-объектом, просто бесполезно для этого в Яве Земля.
И, если по какой-то причине я не понял вашего вопроса, и это не тот ответ, который вы ищете, моим последним предложением было бы проверить Smooks . Smooks реализует интерфейс Visitor
и позволяет выполнять пользовательскую обработку при каждом посещении узла XML его внутренним SAXParser. Вы можете настроить его для запуска метода подсчета всякий раз, когда он достигает tailRecord
, и суммировать счетчики так, как вы этого хотите. Желаем удачи!