【发布时间】:2010-12-14 16:43:19
【问题描述】:
我必须为以下 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,它们看起来相当丑陋。
请建议我任何解决方案来处理这个问题。我会考虑一些简单的事情。
【问题讨论】:
标签: java jaxb quickbooks