XStream: предоставить вычисляемый одиночный тег для всего XML - PullRequest
1 голос
/ 31 октября 2011

Используя XStream lib, моя структура .xml должна выглядеть следующим образом:

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

tailRecord - это последний и единственный тег для всего файла .xml.
удерживайте число record, поэтому должно быть рассчитано.

Можно ли предоставить вычисляемый тег с помощью XStream?
Общий вариант использования следующий:
, когда действие пользователявыполнено, record должно быть добавлено , а tailRecord значение должно быть updated.

1 Ответ

1 голос
/ 08 ноября 2011

Вам нужно будет внести незначительные изменения в вашу схему. Вместо:

<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, и суммировать счетчики так, как вы этого хотите. Желаем удачи!

...