解析从Java Web服务返回的.NET DataSet

我必须从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的DataSet。 当你使用除.NET以外的任何东西为这样的东西生成代理时,你基本上会得到一个如下所示的对象:

@XmlElement(namespace = "http://www.w3.org/2001/XMLSchema", required = true) protected Schema schema; @XmlAnyElement(lax = true) protected Object any; 

第一个字段是应该描述DataSet的实际模式。 当我使用Java中的JAX-WS和JAXB处理它时,它将所有XS-Schema作为Java对象引入,以便在此处表示。 走JAXB的对象树是可能的但不漂亮。 any字段表示由架构指定的架构中的DataSet的原始XML。

数据集的结构非常一致,但数据类型确实发生了变化。 我需要访问类型信息,架构因呼叫而异。 虽然我有几个选择,但似乎没有“好”的选择。

  • 尝试在运行时使用JAXB从架构生成Java对象似乎是个坏主意。 这将太慢,因为它需要每次都发生。
  • 暴力使用JAX-WS引入的JAXB对象遍历模式树。
  • 也许不是使用JAXB来解析模式,而是更容易将其作为XML处理并使用XPath来尝试查找我需要的类型信息。

还有其他我没考虑过的选择吗? 是否有一个Java库可以轻松解析DataSet对象? 其他人可能有类似情况做了什么?

不幸的是,我不认为这里有一个简单的答案。 我要做的是在.NET中创建一个代理Web服务,您可以从Java调用它将接收数据集,将其转换为更易消耗的内容,然后将其返回到Java代码。

您的Java应用程序是否在服务器上运行? 如果是这样,请在服务器上安装Mono并使用Mono内置的ADO.NET将数据集转换为Java可以理解的内容。 优点是数据集的所有解释都是在Mono中为您完成的。 您甚至可以使用IKVM来保持Java语言世界。 无论如何,在Mono世界中,您可以拥有可以进行转换的本地服务,或者只是拥有一个以Java可以理解的格式将数据集转换为文件系统的实用程序。

您是否考虑过对返回的原始XML使用XSLT进行按摩,使其更容易处理?

我已经使用这种方法将复杂的返回值转换为类似的东西

    ....  

这将逻辑转换为非常适合处理XML的语言,而不是用Java手动编码。