如何处理两个几乎相同的XSD文件?

How to deal with two almost identical XSD files?

提问人:colouredmirrorball 提问时间:11/15/2023 更新时间:11/16/2023 访问量:48

问:

我有两个类似的第三方服务(来自同一供应商),它们通过 XML 将数据发送到我们的应用程序。XML 文件遵循大致相同的结构,但在标记深处的某个地方,有一个微妙的区别。

一个服务发送 XML 如下所示:

<node>
    <value>
        <![CDATA[The value]]>
    </value>
</node>

而另一个有更复杂的需求,是这样发送的:

<node>
    <value>
        <subValue>subValue</subValue>
        <description>my description</description>
    </value>
</node>

我们的正常过程是创建一个 XSD 文件,然后使用 IntelliJ 工具“使用 JAXB 从 XML 模式生成 Java 代码”为其生成所需的 POJO 类。但是,这两个文件都有一个“值”标签,但具有不同的数据类型(一个字符串,一个复杂),并且似乎在 XSD 的概念中根本不允许这种情况。我还没有找到一种方法来说服 IntelliJ 或 jaxb-runtime 库接受这种情况。

我尝试在 xsd 文件中将“value”声明为抽象,并具有两个扩展“value”的独立类型。这不起作用,因为在这两种情况下,标记都命名为“value”,并且解析器无法区分两者。

我尝试将第二个XML中“value”标记的全部内容视为字符串,然后将其作为单独的XML文件进行处理,但JAXB库不配合。

“value”标记位于 XML 结构的深处,否则在两个服务中是相等的。 一种解决方案可能是为这两种服务生成一组新的 XSD 文件,但我们确实希望避免这种情况。这将导致 IntelliJ 生成两组 POJO 类,因此我们要么需要完全复制解析逻辑(不需要),要么为所有 POJO 创建包装器(乏味)。

在我看来,解决方案应该很简单,但我总是碰壁。有什么提示或解决方案吗?

java xml xsd jaxb

评论


答:

1赞 Michael Kay 11/16/2023 #1

JAXB 试图将 XML 的半结构化世界与高度结构化的 Java 世界相协调,因此,当 XML 结构是可变的和不可预测的时,它不能很好地工作。

这里最好的解决方案是使用 XSLT 预处理数据,使其具有通用结构,然后再将其编组到结构化的 Java 对象中。

评论

0赞 colouredmirrorball 11/17/2023
绝对不是我喜欢的方法,但这实际上是唯一有效的方法。我觉得可能有一些“正确”的方法可以做到这一点,但如果是这样,它真的隐藏得很好。谢谢!
1赞 Michael Kay 11/17/2023
可能有更好的方法,但我不知何故对此表示怀疑。Java 喜欢数据是有规律的、可预测的和强类型的。XML 不在乎。当然,另一种选择不是使用 Java 处理数据,而是使用面向 XML 的语言,如 XQuery 和 XSLT。