【问题标题】:Forcing xsi:type attribute on generated xml in JAXB在 JAXB 中对生成的 xml 强制 xsi:type 属性
【发布时间】:2015-09-28 10:39:07
【问题描述】:

我需要在字段上强制生成 xsi:type,因为 xml 将通过 xsl 转换表反序列化为不同的对象。数据类型是用 XSD 模式定义的,任何人都可以使用 jaxb 生成类并将数据发送到端点,但是端点是完全动态的,并且使用包含公共数据字段和一些将保存动态数据字段的对象映射的特殊 DTO。

例如这是我得到的:

<?xml version="1.0" encoding="UTF-8"?>
<myp:documento xmlns:myp="mypns" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <myp:sys_name>name</myp:sys_name>
  <myp:sys_path>path</myp:sys_path>
  <myp:sys_type>type</myp:sys_type>
  <myp:dyn_date_modified>2015-09-30T11:13:10.810+02:00</myp:dyn_date_modified>
</myp:documento>

这是我需要的:

<?xml version="1.0" encoding="UTF-8"?>
<myp:documento xmlns:myp="mypns" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <myp:sys_name>name</myp:sys_name>
  <myp:sys_path>path</myp:sys_path>
  <myp:sys_type>type</myp:sys_type>
  <myp:dyn_date_modified xsi:type="xs:dateTime">2015-09-30T11:13:10.810+02:00</myp:dyn_date_modified>
</myp:documento>

因为dyn_date_modified属性会被反序列化成动态Object map..

如果您需要更多详细信息,请告诉我。

【问题讨论】:

  • 为什么需要xs:string 超出了我的理解:基本上所有的XML 都是尽可能的字符串。 -- 但无论如何你都不会从 JAXB 得到这个。
  • 之所以需要它是因为反序列化对象包含对象映射,因此如果类型是 xs:dateTime 它会知道如何反序列化。无论如何我通过对收到的 xml 应用 XSL 预处理来“解决”,因为似乎正如您所说,使用 jaxb 是不可能的。我将用不同的类型更新我的问题,因为 xs:string 不清楚..

标签: java xml xslt jaxb xml-serialization


【解决方案1】:

经过另一天的研究,JAXB 似乎不提供此功能,因为它应该使用始终相同的对象来编组和解组 xml。在我的情况下,我需要通过 XSD 从 xjc 生成的类中编组 xml,然后使用带注释的 DTO 解组,其中包含许多固定字段和三个动态字段映射(以 def_、dyn_ 和 mul_ 开头)。我通过添加一个 xsl 预处理阶段解决了我的要求,该阶段将前缀字段映射到映射并根据名称前缀附加 xsi:type。

<myp:documento xmlns:myp="mypns" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <myp:sys_uuid>2ca56a7e9ca62dcd2d2ad8eeca100fd24</myp:sys_uuid>
  <myp:sys_name>2127a09acda7bf6acf26257bb80372f90</myp:sys_name>
  <myp:dyn_date_modified>2015-09-30T11:13:10.810+02:00</myp:dyn_date_modified>
</myp:documento>

转换为:

<myp:documento xmlns:myp="mypns" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <myp:sys_uuid>uuid</myp:sys_uuid>
  <myp:sys_name>name</myp:sys_name>
  <myp:dynFields>
    <entry>
        <key>dyn_date_modified</key>
        <value xsi:type="xs:dateTime">2015-09-30T11:13:10.810+02:00</value>
    </entry>
  </myp:dynFields>
</myp:documento>

然后被正确解组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2021-08-23
    • 2017-01-23
    • 1970-01-01
    相关资源
    最近更新 更多