提问人:colouredmirrorball 提问时间:11/15/2023 更新时间:11/16/2023 访问量:48
如何处理两个几乎相同的XSD文件?
How to deal with two almost identical XSD files?
问:
我有两个类似的第三方服务(来自同一供应商),它们通过 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 创建包装器(乏味)。
在我看来,解决方案应该很简单,但我总是碰壁。有什么提示或解决方案吗?
答:
JAXB 试图将 XML 的半结构化世界与高度结构化的 Java 世界相协调,因此,当 XML 结构是可变的和不可预测的时,它不能很好地工作。
这里最好的解决方案是使用 XSLT 预处理数据,使其具有通用结构,然后再将其编组到结构化的 Java 对象中。
评论