我需要在Java应用程序中调用一个.NET托管的Web服务。两者之间的互操作性通常非常好。但我遇到了一个问题,即.NET应用程序开发人员选择使用.NET DataSet对象公开数据。有很多文章写明为什么不应该这样做以及它如何使互操作性变得困难:
- http://www.hanselman.com/blog/ReturningDataSetsFromWebServicesIsTheSpawnOfSatanAndRepresentsAllThatIsTrulyEvilInTheWorld.aspx
- http://www.lhotka.net/weblog/ThoughtsOnPassingDataSetObjectsViaWebServices.aspx
- https://web.archive.org/web/20210616111510/https://aspnet.4guysfromrolla.com/articles/051805-1.aspx
- http://www.theserverside.net/tt/articles/showarticle.tss?id=Top5WSMistakes
@XmlElement(namespace = "http://www.w3.org/2001/XMLSchema", required = true)
protected Schema schema;
@XmlAnyElement(lax = true)
protected Object any;
第一个字段是实际描述数据集的模式。当我在Java中使用JAX-WS和JAXB处理它时,它将所有XS-Schema作为Java对象带入这里表示。遍历JAXB对象树是可能的,但不太美观。任何字段表示由模式指定的DataSet中的原始XML。
数据集的结构非常一致,但数据类型会发生变化。我需要访问类型信息,而模式从调用到调用会有所变化。我想过几个选项,但都似乎不是很好的选择。
- 尝试在运行时使用JAXB从模式生成Java对象似乎不是一个好主意。这将太慢,因为每次都需要进行。
- 使用JAX-WS带入的JAXB对象强制遍历模式树。
- 也许,与其使用JAXB解析模式,更容易将其视为XML,并使用XPath查找所需的类型信息。
还有其他我没有考虑的选项吗?有没有Java库可以轻松解析DataSet对象?其他人有没有类似情况的做法?