我有两个类似的第三方服务(来自同一供应商),它们通过XML将数据发送到我们的应用程序.这两个XML文件基本上遵循相同的 struct ,但在标记的深处有一个细微的不同.

一项服务发送的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类.然而,这两个文件都有一个"Value"标记,但具有不同的数据类型(一个字符串,一个复杂 struct ),似乎这种情况在XSD的概念中是不允许的.我还没有找到一种方法来说服IntelliJ或jaxb运行时库接受这种情况.

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

我try 将第二个XML中的"Value"标记的整个内容作为字符串处理,然后将其作为单独的XML文件处理,但JAXB库不支持这一点.

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

在我看来,解决方案应该很简单,但我一直在撞墙.有什么提示或解决方案吗?

推荐答案

JAXB试图调和半 struct 化的XML世界和高度 struct 化的Java世界,因此当XML struct 可变且不可预测时,它不能很好地工作.

这里最好的解决方案是使用XSLT对数据进行预处理,使其具有一个公共 struct ,然后再将其编组到 struct 化的Java对象中.

Java相关问答推荐

是否可以从@ TrustMapping中删除特定方法的基路径?

如何才能使我的程序不会要求两次输入?

如何确定springboot在将json字段转换为Dto时如何处理它?

内存中的H2修剪尾随空格

为什么使用JDK21获取锁定锁比使用JDK11慢

在Java 17中使用两个十进制数字分析时间时出错,但在Java 8中成功

SonarLint:只能有条件地调用方法(S)

Java构造函数分支

try 使用Spring集成和MySQL实现发件箱模式时,锁定等待超时

无法使用Freemarker从XML中读取重复的标记值

删除打印语句会影响功能...腐败在起作用?

项目react 堆中doOnComplete()和Subscribe()的第三个参数之间的差异

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

记录是类的语法糖吗?

处理4.3问题:javax.xml.ind包不存在(&Q;).您可能在学习GitHub教程时遗漏了库.&Q

模拟JUnit未检测到返回字符串的方法的任何声纳覆盖

如何在Struts2中使用操作类中的结果注释重定向到不同的命名空间

升级版本后出现非法访问错误

如何在Java中正确实现填字游戏求解器

对于 Hangman 游戏,索引 0 超出长度 0 的范围