情况
对于一个项目,我们必须处理大量的XSD。这些模式中的许多都是GML或以某种方式与GML相关。我们使用JAXB2为我们提供Java类,并将XML映射到Java对象。这令人沮丧,但是对于OGC Bindings项目这样的项目,我们已经走了很长一段路。
问题
当前解组数据时,JAXB2中的继承似乎有问题。当我们解组一个集合时,该集合没有被填充。因此,我使用ValidationEventCollector
作为处理程序来检查代码。尽管没有抛出Exception
,但ValidationEventCollector
仍然会给我错误:unexpected element ...
相关代码
我们将GML 3.1.1与recommended bindings结合使用,并将CityGML与以下绑定结合使用:
绑定文件
<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 />
,但这没什么不同。除了绑定之外,我们还有一个有效的目录(关于其他模式),并且在编译之前删除了重复的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
类中的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模式和工具项目”的作者。
您的绑定似乎正确,对象工厂看起来不错,它应该可以工作。
您遇到的核心问题是由于某些原因,gml:featureMember没有被cit:cityObjectMember取代。很难说为什么。我试图通过分析JAXB为您的类创建的运行时模型来解决该问题。以某种方式,您在@XmlElementDecl
上的createCityObjectMember
被忽略了。
对于这种事情,我的方法通常是采取一些无效的方法,然后采取一种有效的方法,然后尝试缩小间隙,从而确定本质上存在问题的切削刃。
在这种情况下,我将采用代码并构建一个替代工作的最小示例。然后,我将尝试减少您不起作用的示例,将其删除无关的属性,等等。最终,您将获得优势,这将为您提供提示信息。
我的猜测是,范围不广。也许gml:featureMemeber的替换受到某种限制,而您的替换与“ limit”不匹配。不调试就很难说。
请随时与我联系(gmx net上的valikov),提供您的映射(或整个项目),我会尽力帮助您。