处理 Jackson XML 中的 xml 扩展 我所期待的

问题描述

问题描述

我使用的是 Jackson 数据格式 2.12.3 版

我正在尝试解决读取 XML 的问题。 XML 是用于 GPX 文件 (http://www.topografix.com/GPX/1/1) 的 XML,它定义了一个元素 extensions,用于包含来自外部 xsd 文件的元素(例如 Garmin 定义了几个扩展名)。因此,您将拥有一个包含定义为

的元素的类型
    <xsd:element name="extensions" type="extensionsType" minOccurs="0">
    </xsd:element>

类型定义为

    <xsd:complexType name="extensionsType">
        <xsd:sequence>
            <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
            </xsd:any>
        </xsd:sequence>
    </xsd:complexType>

例如,上述扩展之一(http://www.garmin.com/xmlschemas/TrackPointExtension/v1)将扩展类型重新定义为

  <xsd:complexType name="TrackPointExtension_t">
    <xsd:annotation><xsd:documentation>
    This type contains data fields that cannot
    be represented in track points in GPX 1.1 instances.
    </xsd:documentation></xsd:annotation>
    <xsd:sequence>
      <xsd:element name="atemp" type="degreesCelsius_t" minOccurs="0" />
      <xsd:element name="wtemp" type="degreesCelsius_t" minOccurs="0" />
      <xsd:element name="depth" type="Meters_t" minOccurs="0" />
      <xsd:element name="hr" type="BeatsPerMinute_t" minOccurs="0"/>
      <xsd:element name="cad" type="RevolutionsPerMinute_t" minOccurs="0"/>
      <xsd:element name="Extensions" type="Extensions_t" minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>

所以,这个 xml 的一个实例可能看起来像

    <?xml version="1.0" encoding="UTF-8"?>
    <gpx creator="FooGPX"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd"
            version="1.1"
            xmlns="http://www.topografix.com/GPX/1/1"
            xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1">
     
        ....
        
        <extensions>
         <gpxtpx:TrackPointExtension>
          <gpxtpx:atemp>26</gpxtpx:atemp>
          <gpxtpx:hr>94</gpxtpx:hr>
          <gpxtpx:cad>54</gpxtpx:cad>
         </gpxtpx:TrackPointExtension>
        </extensions>
    
        ....
    
    </gpx>

其中 .... 是为简洁起见省略的 xml 代码

现在,前提是:Jackson 关于 XML 的文档非常糟糕,但从测试来看,他们似乎也可以对 XML 使用一些 JSON 注释。例如。 https://github.com/FasterXML/jackson-dataformat-xml/blob/2.13/src/test/java/com/fasterxml/jackson/dataformat/xml/deser/TypeAttributeOrder242Test.java

尝试过的解决方案之一

因此,我将我的示例建模如下

@JacksonXmlRootElement(localName = "extensions")
public class Extensions {

    /**
     * You can add extend GPX by adding your own elements from another schema here.
     */
    @JacksonXmlElementWrapper(useWrapping = false)
    @JsonDeserialize(using = ExtensionsDeserializer.class)
    @JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
    private List<Extension> extensions;

    // gettes/setters

}

Extension 类只是一个 PoJO。

我所期待的

老实说,我希望 Jackson 带我进入我在注释中定义的 Deserializer,但这从未发生过。 因此,我真的不知道如何指导 Jackson 解决一种或多种可能的实现。

理论上,我可以让ObjectMapper阅读Object

HashMap readxml = objectMapper.readValue(inputStream,Object.class)

但这会返回一个 HashMap<String,String>。这并不是人们对对象映射器的真正期望,因为这样就需要花费大量时间将映射映射到 POJO。

那么,您知道如何解决这个问题吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)