在Java中解析从.NET Web Service返回的.NET DataSet

17
我需要在Java应用程序中调用一个.NET托管的Web服务。两者之间的互操作性通常非常好。但我遇到了一个问题,即.NET应用程序开发人员选择使用.NET DataSet对象公开数据。有很多文章写明为什么不应该这样做以及它如何使互操作性变得困难: 我的问题是,尽管不建议这样做,但我必须使用Java调用返回DataSet的Web服务。如果您使用除.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对象树是可能的,但不太美观。任何字段表示由模式指定的DataSet中的原始XML。

数据集的结构非常一致,但数据类型会发生变化。我需要访问类型信息,而模式从调用到调用会有所变化。我想过几个选项,但都似乎不是很好的选择。

  • 尝试在运行时使用JAXB从模式生成Java对象似乎不是一个好主意。这将太慢,因为每次都需要进行。
  • 使用JAX-WS带入的JAXB对象强制遍历模式树。
  • 也许,与其使用JAXB解析模式,更容易将其视为XML,并使用XPath查找所需的类型信息。

还有其他我没有考虑的选项吗?有没有Java库可以轻松解析DataSet对象?其他人有没有类似情况的做法?

3个回答

9

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


3

您的Java应用程序运行在服务器上吗?如果是,可以在服务器上安装Mono,并使用内置于Mono中的ADO.NET将数据集转换为Java可理解的格式。优点是在Mono中已经为您完成了数据集的所有解释。您甚至可以使用IKVM保持在Java语言世界中。在Mono世界中,您可以拥有一个本地服务来进行转换,或者只需编写一个实用工具,将数据集以Java可理解的格式转换到文件系统中。


很好的开箱即用思维。 - David Robbins
当你有独特的想法时,被人听到总是很不错的 :) - zumalifeguard

1
你有没有考虑使用XSLT对原始的XML返回值进行处理,以便更轻松地处理它?
我曾经使用这种方法将复杂的返回值转换为类似于...的东西。
<ops>
  <set name="foo" value="bar"/>
  <set name="foo2" value="bar2" />
  ....
 </ops>

这将把逻辑移入一种非常适合处理XML的语言中,而不是在Java中手工编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接