【问题标题】:Parsing a .NET DataSet returned from a .NET Web Service in Java解析从 Java 中的 .NET Web 服务返回的 .NET 数据集
【发布时间】:2010-04-19 13:17:10
【问题描述】:

我必须使用 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 的对象树是可能的,但并不漂亮。 any 字段表示由架构指定的架构中的 DataSet 的原始 XML。

数据集的结构非常一致,但数据类型确实发生了变化。我需要访问类型信息,并且架构确实因调用而异。我有一些选择,但似乎没有一个是“好”的选择。

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

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

【问题讨论】:

    标签: java .net web-services interop dataset


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 开箱即用的想法很好。
      • 开箱即用的想法总是很高兴 :)
      【解决方案3】:

      您是否考虑过对返回的原始 XML 使用 XSLT 以将其处理成您可以更轻松处理的内容?

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

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

      这将逻辑转移到一种非常适合处理 XML 的语言中,而不是用 Java 手动编码。

      【讨论】:

        猜你喜欢
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 2013-04-08
        • 2011-08-13
        相关资源
        最近更新 更多