2010-04-19 97 views
17

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

我的问题是,尽管这不是被推荐的做法,但我坚持不得不使用返回带有Java的DataSet的Web服务。当你产生这样的事情的代理有什么比.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对象似乎是一个坏主意。这会太慢,因为它需要每次都发生。
  • 蛮力行走使用JAXB架构树对象是JAX-WS带进来。
  • 也许不是使用JAXB解析的模式会更容易对付它的XML和使用XPath的尝试和发现我需要的类型信息。

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

回答

9

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

+0

请让我知道你是否有任何尝试, – 2013-04-04 07:43:49

3

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

+0

好的开箱思维。 – 2010-04-29 16:49:14

+0

在开箱时听到总是很高兴:) – zumalifeguard 2010-05-06 23:02:33

+0

请让我知道你是否有任何人尝试过, – 2013-04-04 07:43:10

1

您是否考虑过在返回的原始XML上使用XSLT来将它按摩到可以更容易处理的东西?

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

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

这使逻辑到适合于处理XML,而不是在Java中handcoding它的语言。

+0

请让我知道你是否有任何人尝试过, – 2013-04-04 07:42:35