在 Java 中解析从 .NET Web 服务返回的 .NET 数据集
我必须从 Java 应用程序中使用 .NET 托管的 Web 服务。两者之间的互操作性通常非常好。我遇到的问题是.NET应用程序开发人员选择使用.NET DataSet对象公开数据。有很多文章写了为什么你不应该这样做,以及它如何使互操作性变得困难:
- http://www.hanselman.com/blog/ReturningDataSetsFromWebServicesIsTheSpawnOfSatanAndRepresentsAllThatIsTrulyEvilInTheWorld.aspx
- http://www.lhotka.net/weblog/ThoughtsOnPassingDataSetObjectsViaWebServices.aspx
- http://aspnet.4guysfromrolla.com/articles/051805-1.aspx
- http://www.theserverside.net/tt/articles/showarticle.tss?id=Top5WSMistakes
我的问题是,尽管这不是推荐的做法,但我仍然不得不使用Web服务返回带有Java的数据集。当您使用.NET以外的任何内容为类似内容生成代理时,您基本上最终会得到一个如下所示的对象:
@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 的对象树中行走是可能的,但不漂亮。any 字段表示由架构指定的架构中的数据集的原始 XML。
数据集的结构非常一致,但数据类型确实会发生变化。我需要访问类型信息,并且架构确实因调用而异。虽然我有一些选择,但没有一个似乎是“好”的选择。
- 尝试在运行时使用 JAXB 从模式生成 Java 对象似乎是一个坏主意。这太慢了,因为它每次都需要发生。
- 使用 JAX-WS 引入的 JAXB 对象对模式树进行暴力破解。
- 也许与其使用 JAXB 来解析模式,不如将其作为 XML 处理,并使用 XPath 尝试查找我需要的类型信息。
还有其他我没有考虑过的选项吗?是否有 Java 库可以轻松解析 DataSet 对象?其他可能有类似情况的人做了什么?