![](/img/trans.png)
[英]JAXB - How to use XmlAdapter for unmarshalling a list when wrapper element is root?
[英]JAXB Unmarshalling issues when wrapper element and root element are the same
我有一個具有以下結構的XML:
<?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類是非常基本的類,並且僅具有便捷的方法,如覆蓋了toString的對象,可打印對象的JSON版本。與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結構,並且如果可能的話,我想避免預處理和操縱原始提要文件。 有沒有更好的方法來注釋我的類以避免異常?
PS:我不會自動生成我的類,它們都是基於XML字段手動輸入的。
您需要為元素模型定義名稱空間:
@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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.