在 Java 中解析从 .NET Web 服务返回的 .NET 数据集

2022-09-03 02:32:42

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

我的问题是,尽管这不是推荐的做法,但我仍然不得不使用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 对象?其他可能有类似情况的人做了什么?


答案 1

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


答案 2

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


推荐