Мне нужно создать объектную модель для следующих XML:
Пример XML 1:
<InvoiceAdd>
<TxnDate>2009-01-21</TxnDate>
<RefNumber>1</RefNumber>
<InvoiceLineAdd>
</InvoiceLineAdd>
</InvoiceAdd>
Пример XML 2:
<SalesOrderAdd>
<TxnDate>2009-01-21</TxnDate>
<RefNumber>1</RefNumber>
<SalesOrderLineAdd>
</SalesOrderLineAdd>
</SalesOrderAdd>
Вывод XML будет основан на одном строковом параметре или перечислении. String txnType = "Счет-фактура"; (или "SalesOrder");
Я бы использовал один класс TransactionAdd:
@XmlRootElement
public class TransactionAdd {
public String txnDate;
public String refNumber;
private String txnType;
...
public List<LineAdd> lines;
}
вместо использования подклассов или чего-либо еще. Код, который создает экземпляр TransactionAdd, одинаков для обоих типов транзакций, он отличается только типом.
Этот XML используется довольно известным продуктом под названием QuickBooks и используется веб-службой QuickBooks - поэтому я не могу изменить XML, но я хочу упростить возможность установки имени элемента на основе свойства (txnType ).
Я бы рассмотрел что-то вроде метода определения имени целевого элемента:
@XmlRootElement
public class TransactionAdd {
public String txnDate;
public String refNumber;
private String txnType;
...
public List<LineAdd> lines;
public String getElementName() {
return txnType + "Add";
}
}
Различные транзакции будут создаваться с использованием следующего кода:
t = new TransactionAdd();
t.txnDate = "2010-12-15";
t.refNumber = "123";
t.txnType = "Invoice";
Целью является сериализация объекта t с именем элемента верхнего уровня на основе txnType. E.g.:
<InvoiceAdd>
<TxnDate>2009-01-21</TxnDate>
<RefNumber>1</RefNumber>
</InvoiceAdd>
В случае t.txnType = "SalesOrder" результат должен быть
<SalesOrderAdd>
<TxnDate>2009-01-21</TxnDate>
<RefNumber>1</RefNumber>
</SalesOrderAdd>
В настоящий момент я вижу только один обходной путь с подклассами InvoiceAdd и SalesOrderAdd и с использованием аннотации @XmlElementRef, чтобы иметь имя, основанное на имени класса. Но ему нужно будет создавать экземпляры разных классов в зависимости от типа транзакции, а также иметь два других разных класса InvoiceLineAdd и SalesOrderLineAdd, которые выглядят довольно некрасиво.
Пожалуйста, предложите мне любое решение, чтобы справиться с этим. Я хотел бы рассмотреть что-то простое.