问题描述
问题描述
我使用的是 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 (将#修改为@)