java - UnmarshalException:意外元素(uri:“http://www.namespace.com/RTS”,本地:“容器”)
问题描述
我正在尝试将我的 xml 映射到 java 类。Xml 来自第三方服务。结构相同,但可能有不同的前缀或命名空间。XML:
<?xml version="1.0" encoding="UTF-8"?>
<xdms:container xmlns:xdms="http://www.namespace.com/RTS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xdms:uid="FHGHDFGDFJKGDFHG" xdms:version="3.2">
<xdms:requisites>
<xdms:documentKind>letter</xdms:documentKind>
<xdms:classification>main</xdms:classification>
<xdms:annotation>unknown</xdms:annotation>
</xdms:requisites>
</>
我的课程:
@XmlRootElement(name = "container")
@XmlAccessorType(XmlAccessType.FIELD)
public class Container {
private static final long serialVersionUID = 1L;
@XmlElement(name = "requisites")
private Requisites requisites;
public Container() {
super();
}
@Override
public String toString() {
return "Container{" +
"requisites=" + requisites +
'}';
}
}
@XmlRootElement(name = "requisites")
@XmlAccessorType(XmlAccessType.FIELD)
public class Requisites implements Serializable {
private static final long serialVersionUID = 1L;
private String documentKind;
private String classification;
private String annotation;
public Requisites() {
super();
}
@Override
public String toString() {
return "Requisites{" +
"documentKind='" + documentKind + '\'' +
", classfication='" + classification + '\'' +
", annotation='" + annotation + '\'' +
'}';
}
}
以及我在其中运行解析的主类:
JAXBContext jaxbContext;
File xmlFile = new File("test.xml");
try
{
jaxbContext = JAXBContext.newInstance(Container.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Container cont = (Container) jaxbUnmarshaller.unmarshal(xmlFile);
System.out.println(cont);
}
catch (JAXBException e)
{
e.printStackTrace();
}
我得到了错误:
javax.xml.bind.UnmarshalException:意外元素(uri:“ http://www.namespace.com/RTS", local:"container")。预期元素是 com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:726) 处的 <{}container>、<{}requisites>在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:247) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader. java:242) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:109) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$ DefaultRootLoader.childElement(UnmarshallingContext.java:1131) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:556) 在 com.sun.xml.internal.bind.v2。运行时.unmarshaller。UnmarshallingContext.startElement(UnmarshallingContext.java:538) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153) 在 com.sun.org.apache.xerces.internal。 com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374) 上 com.sun.org.apache.xerces.internal 上的 parser.AbstractSAXParser.startElement(AbstractSAXParser.java:509)。 impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3132) 在 com.sun.org.apache。 xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:852)startElement(UnmarshallingContext.java:538) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153) 在 com.sun.org.apache.xerces.internal.parsers。 AbstractSAXParser.startElement(AbstractSAXParser.java:509) 位于 com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374) 位于 com.sun.org.apache.xerces.internal.impl。 XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3132) 在 com.sun.org.apache.xerces。 internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:852)startElement(UnmarshallingContext.java:538) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153) 在 com.sun.org.apache.xerces.internal.parsers。 AbstractSAXParser.startElement(AbstractSAXParser.java:509) 位于 com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374) 位于 com.sun.org.apache.xerces.internal.impl。 XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3132) 在 com.sun.org.apache.xerces。 internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:852)internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153) 在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509) 在 com.sun。 org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374) 在 com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613) 在 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 )internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153) 在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509) 在 com.sun。 org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374) 在 com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613) 在 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 )internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509) 在 com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374) 在 com.sun.org.apache.xerces。 internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3132) 在 com.sun.org。 apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:852)internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509) 在 com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374) 在 com.sun.org.apache.xerces。 internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3132) 在 com.sun.org。 apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:852)impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3132) 在 com.sun.org.apache。 xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:852)impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3132) 在 com.sun.org.apache。 xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:852)
UPD: 我添加了名称空间,错误消失了。但是我的对象的字段没有填充信息。它们是空的,尽管在 xml 中它们充满了信息
容器{requisites=Requisites{documentKind='null', classfication='null', annotation='null'}}
解决方案
您没有在 jaxb 类中指定命名空间
像这样的东西:
@XmlRootElement(name = "container", namespace = "http://www.namespace.com/RTS")
@XmlAccessorType(XmlAccessType.FIELD)
public class Container {
@XmlElement(name = "requisites", namespace="http://www.namespace.com/RTS")
private Requisites requisites;
}
您可能还需要为每个元素添加命名空间Requisites
。
@XmlRootElement(name = "requisites")
@XmlAccessorType(XmlAccessType.FIELD)
public class Requisites implements Serializable {
private static final long serialVersionUID = 1L;
@XmlElement(name = "documentKind", namespace="http://www.namespace.com/RTS")
private String documentKind;
@XmlElement(name = "classification", namespace="http://www.namespace.com/RTS")
private String classification;
@XmlElement(name = "annotation", namespace="http://www.namespace.com/RTS")
private String annotation;
推荐阅读
- html - 试图使两个导航菜单的宽度相同
- python - 如何在Python中使用.find()(或find的替代方法)从现有列中选择信息创建一个新列?
- asp.net - ASP.Net 表单身份验证 - 请求不会重定向到 IE 中的 loginUrl
- c# - 生成的 AAD CallbackUrl 是一个 IP 地址,并且在部署到服务结构时与应用注册中的回复 Url 不匹配
- castle-dynamicproxy - 可以将 Castle DynamicProxy 配置为不写入“ref”参数吗?
- amazon-web-services - Amazon DocumentDB 是否能够使用 gridFS
- python - 使用 Chromedriver 在 Outlook Office 上找到“发送项目”
- ms-access-2016 - 用于填充表格的表单不会写入下一个打开的行,仅写入以 1 开头的现有行
- java - Avro 1.9.0 无法编译生成的 java 代码并显示错误消息:找不到符号方法 customEncode(org.apache.avro.io.Encoder)
- entity-framework-core - EF Core Migrations - 如何修改以前的迁移?