2017-09-14 74 views
0

我有具有以下結構的XML:JAXB解組的問題時,包裝元素和根元素是相同的

<?xml version="1.0" encoding="UTF-8"?> 
<catalog_titles xmlns="http://www.company.com/catalog3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.company.com/catalog3 catalog3.xsd" version="1.0" created="2017-04-26T07:31:12.443Z" language="en" country="xx"> 
    <catalog_title id="80153288" type="product1"> 
    ... Catalog specific fields ... 
    </catalog_title> 
    <catalog_title id="2" type="product2"> 
    </catalog_title"> 
</catalog_titles> 

我有以下映射類:

CatalogFeed.java

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name="catalog_titles") 
public class CatalogFeed extends Model { 
    @XmlElement(name="catalog_title") 
    List<CatalogTitle> catalogTitles; 
} 

CatalogTitle.java

@XmlAccessorType(XmlAccessType.FIELD) 
public class CatalogTitle extends Model { 
    @XmlAttribute(name="id") 
    private int id; 
    ... Other fields with similar mappings 
} 

當我嘗試使用此設置進行分析時(解組類是通用的,並且對於其他幾個文件可以正常工作,而Model類非常基本,只有像打包JSON版本的對象的over-ridden toString這樣的便利方法。沒有相關的XML),我收到以下異常:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.company.com/catalog3", local:"catalog_titles"). Expected elements are <{}catalog_titles> 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:726) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:247) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:242) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:109) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1131) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:556) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:538) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153) 
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509) 
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374) 
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3132) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:852) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602) 
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:841) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770) 
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) 
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) 
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:243) 
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214) 
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157) 
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162) 
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:171) 
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:189) 
at com.mycompany.ingestion.importer.parser.GenericParser.parse(GenericParser.java:19) 
at com.mycompany.ingestion.importer.Importer.lambda$0(Importer.java:64) 
at java.util.ArrayList.forEach(ArrayList.java:1249) 
at com.mycompany.ingestion.importer.Importer.loadFeedData(Importer.java:62) 
at com.mycompany.ingestion.importer.Importer.run(Importer.java:43) 
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:732) 
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:716) 
at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:703) 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:304) 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) 
at com.mycompany.ingestion.importer.ImporterApplication.main(ImporterApplication.java:10) 

有趣的是,如果我刪除catalog_titles的所有屬性,只是把它作爲,解析器工作正常。

我無法控制XML結構,如果可能的話,我想避免預處理和操作原始提要文件。有沒有更好的方法來註釋我的類以避免異常?

P.S:我沒有自動生成我的類,它們都是基於XML字段手動輸入的。

回答

1

您需要定義命名空間爲您的元模型:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(namespace = "http://www.company.com/catalog3", name = "catalog_titles") 
public static class CatalogFeed { 
    @XmlElement(namespace = "http://www.company.com/catalog3", name = "catalog_title") 
    List<CatalogTitle> catalogTitles; 
} 
+0

謝謝。現在沒有例外,但所有映射的字段沒有被加載。我是否應該全面使用命名空間,包括CatalogTitle類中的字段? – user1452030

+0

將其設置在所有'@ XmlElement'屬性中。 – teppic

+0

如果它們中有很多可以在package-info中使用'@ XmlSchema'註釋設置默認名稱空間(請參閱http://blog.bdoughan.com/2010/08/jaxb-namespaces.html)。 – teppic