gpt4 book ai didi

java - JAXB 解码和继承

转载 作者:行者123 更新时间:2023-11-30 03:58:24 25 4
gpt4 key购买 nike

情况
对于一个项目,我们必须处理相当大量的 XSD。许多这些模式都是 GML 或以某种方式与 GML 相关。我们使用 JAXB2 为我们提供 Java 类并将 XML 映射到 Java 对象。这令人沮丧,但通过 OGC Bindings 项目等项目,我们已经取得了长足的进步。

问题
当我们当前解码数据时,似乎在 JAXB2 中存在继承问题。当我们解码一个集合时,这个集合并没有被填充。所以我用了ValidationEventCollector作为处理程序来检查代码。虽然没有Exception抛出,ValidationEventCollector仍然会给我错误:unexpected element ...

相关代码
我们使用 GML 3.1.1 和 recommended bindings和 CityGML 具有以下绑定(bind):绑定(bind).xjb

<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
xmlns:annox="http://annox.dev.java.net" jaxb:extensionBindingPrefixes="xjc inheritance">

<jaxb:globalBindings
fixedAttributeAsConstantProperty="false" typesafeEnumBase="xs:string"
typesafeEnumMemberName="generateName" generateIsSetMethod="true">
<xjc:noValidator />
<xjc:noValidatingUnmarshaller />
</jaxb:globalBindings>

<jaxb:bindings schemaLocation="citygml-2.0/2.0/cityGMLBase.xsd"
node="/xs:schema">
<jaxb:schemaBindings>
<jaxb:package name="net.opengis.citygml.v_2_0" />
</jaxb:schemaBindings>
<jaxb:bindings node="xs:complexType[@name='CityModelType']">
<annox:annotate>
<annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement"
name="CityModel"
namespace="http://www.opengis.net/citygml/2.0" />
</annox:annotate>
</jaxb:bindings>
</jaxb:bindings>

</jaxb:bindings>

我们也尝试过<xjc:simple />但这并没有什么区别。除了绑定(bind)之外,我们还有一个可以工作(关于其他模式)并且重复的目录 ObjectFactory类在编译前被删除。

以下(部分)XML 用于解码

<?xml version="1.0" encoding="UTF-8"?>
<cit:CityModel xmlns:gml="http://www.opengis.net/gml" xmlns:cit="http://www.opengis.net/citygml/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" gml:id="example">
<gml:boundedBy>
<gml:Envelope srsName="http://www.opengis.net/def/crs/EPSG/0/28992">
<gml:lowerCorner>144280.193 414155.258</gml:lowerCorner>
<gml:upperCorner>147300.873 416928.884</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<cit:cityObjectMember>
...
</cit:cityObjectMember>
<cit:cityObjectMember>
...
</cit:cityObjectMember>
<cit:cityObjectMember>
...
</cit:cityObjectMember>
</cit:CityModel>

cityObjectMember (问题所在)ObjectFactory 中的代码类(class) net.opengis.citygml.v_2_0

@XmlElementDecl(namespace = "http://www.opengis.net/citygml/2.0", name = "cityObjectMember", substitutionHeadNamespace = "http://www.opengis.net/gml", substitutionHeadName = "featureMember")
public JAXBElement<FeaturePropertyType> createCityObjectMember(FeaturePropertyType value) {
return new JAXBElement<FeaturePropertyType>(_CityObjectMember_QNAME, FeaturePropertyType.class, null, value);
}

使用相应的解码代码

Unmarshaller um = JAXBContext.newInstance("net.opengis.citygml.v_2_0:net.opengis.gml").createUnmarshaller();

JAXB2ValidationEventCollector vec = new JAXB2ValidationEventCollector();
um.setEventHandler(vec);

Object unmarshalled = um.unmarshal(this.getFile());

// Check for errors, when there are (validation) errors, throw them to System.err.
if (vec.hasEvents()) {
for (ValidationEvent ve : vec.getEvents()) {
System.err.println(String.format("[Line: %d Column: %d] %s", ve.getLocator().getLineNumber(),
ve.getLocator().getColumnNumber(), ve.getMessage()));
}
}

作为 ValidationEventCollector:

import javax.xml.bind.ValidationEvent;
import javax.xml.bind.util.ValidationEventCollector;

class JAXB2ValidationEventCollector extends ValidationEventCollector {

@Override
public boolean handleEvent(ValidationEvent event) {
super.handleEvent(event);
return true;
}
}

问题!
首先,正如我已经提到的,cityObjectMember的没有被解析。这就是问题的根源。这就是为什么我将 eventHandler 添加到解码器中。这导致了以下错误:

[Line: 56 Column: 27] unexpected element (uri:"http://www.opengis.net/citygml/2.0", local:"cityObjectMember"). Expected elements are <{http://www.opengis.net/gml}ellipsoidName>,<{http://www.opengis.net/gml}meridianName>,<{http://www.opengis.net/gml}featureMember>,<{http://www.opengis.net/citygml/2.0}_GenericApplicationPropertyOfCityModel>,<{http://www.opengis.net/gml}parameterName>,<{http://www.opengis.net/gml}groupName>,<{http://www.opengis.net/gml}srsName>,<{http://www.opengis.net/gml}metaDataProperty>,<{http://www.opengis.net/gml}priorityLocation>,<{http://www.opengis.net/gml}location>,<{http://www.opengis.net/gml}coordinateOperationName>,<{http://www.opengis.net/gml}datumName>,<{http://www.opengis.net/gml}featureMembers>,<{http://www.opengis.net/gml}methodName>,<{http://www.opengis.net/gml}boundedBy>,<{http://www.opengis.net/gml}csName>,<{http://www.opengis.net/gml}description>,<{http://www.opengis.net/gml}name>

老实说...我现在很困惑。我不知道如何继续下去。因此,如果有人知道答案或问题的根源,那就太好了。谢谢:)。

最佳答案

我是“OGC 模式和工具项目”的作者。您的绑定(bind)看起来是正确的,对象工厂看起来不错,它应该可以工作。您遇到的核心问题是 gml:featureMember 由于某种原因未被 cit:cityObjectMember 取代。很难说为什么。我将通过尝试分析 JAXB 为您的类创建的运行时模型来解决这个问题。不知何故,您在 createCityObjectMember 上的 @XmlElementDecl 被忽略。

我处理这类事情的方法通常是采取一些不起作用的东西和一些起作用的东西,然后尝试缩小差距,从而确定本质上是问题的前沿。

在这种情况下,我将获取代码并构建一个可以进行替换的最小示例。然后我会尝试减少你不工作的例子,去掉不相关的属性等等。最后,您将获得优势,这将为您提供错误的线索。

我的猜测,如果不深入的话,那就是范围。也许 gml:featureMemeber 的替换在某种程度上受到限制,并且您的替换与“限制”不匹配。没有调试就很难说。

请随时联系我(gmx net 的 valikov),提供您的映射(或整个项目),我会尽力帮助您。

关于java - JAXB 解码和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22528951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com