我必须为以下 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 = "发票"; (或“销售订单”);
我会使用单个类 TransactionAdd:
@XmlRootElement
public class TransactionAdd {
public String txnDate;
public String refNumber;
private String txnType;
...
public List<LineAdd> lines;
}
而不是使用子类或其他任何东西。创建 TransactionAdd 实例的代码对于两种类型的事务都是相同的,只是类型不同。
此 XML 由一个名为 QuickBooks 的知名产品使用,并由 QuickBooks Web 服务使用 - 因此我无法更改 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";
目标是根据 txnType 使用顶级元素名称序列化 t 对象。例如:
<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,它们看起来相当丑陋。
请建议我任何解决方案来处理这个问题。我会考虑一些简单的事情。