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

时间:2010-04-19 13:17:11

标签: java .net web-services interop dataset

我必须从Java应用程序中使用.NET托管的Web服务。两者之间的互操作性通常非常好。我遇到的问题是.NET应用程序开发人员选择使用.NET DataSet对象公开数据。有很多文章写到为什么你不应该这样做以及它如何使互操作性变得困难:

我的问题是,尽管不推荐这种做法,但我不得不使用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对象,使用Brute force遍历架构树。
  • 也许不是使用JAXB来解析模式,而是更容易将其作为XML处理并使用XPath来尝试查找我需要的类型信息。

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

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

的东西
<ops>
  <set name="foo" value="bar"/>
  <set name="foo2" value="bar2" />
  ....
 </ops>

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