zig*_*ggy 3 java xml spring xsd jaxb
我有一个XML文档,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xs:msgdata xmlns:xs="http://www.myCompany.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.myCompany.com msgdata.xsd">
<xs:msgid>MsgID001</xs:msgid>
<xs:msgHash>hlkJKLHljkhkjlHKJLHkjl6y987HJKH</xs:msgHash>
</xs:msgdata>
Run Code Online (Sandbox Code Playgroud)
还向我发送了一个模式文档(称为msgdata.xsd).我正在使用JAXB将上述xml文档解组为Java对象.解组代码如下所示:
final JAXBContext context = JAXBContext.newInstance(clazz);
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File("C:\\temp\\msgdata.xsd"));
final Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setSchema(schema);
return (T) unmarshaller.unmarshal(new StringReader(xml));
Run Code Online (Sandbox Code Playgroud)
XML的目标对象如下所示(然后将对象转换为休眠实体.
@XmlRootElement(name = "msgdata")
public class Message {
private String msgid;
private String msgHash;
@XmlElement(name = "msgid")
public String getMsgid() {
return msgid;
}
public void setMsgid(String msgid) {
this.msgid = msgid;
}
@XmlElement(name = "msgHash")
public String getMsgHash() {
return msgHash;
}
public void setMsgHash(String msgHash) {
this.msgHash = msgHash;
}
Run Code Online (Sandbox Code Playgroud)
几个问题:
XML文档具有对模式的引用(请参阅schemaLocation条目).它将如何在我的文件系统上找到架构文档?XML文档中是否需要该模式引用?
现在的XML文档无法解组.当我尝试解组时,我收到以下错误:
引起:javax.xml.bind.UnmarshalException:意外元素(uri:"http://www.myCompany.com",local:"msgdata").预期的元素是com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:662)[jaxb-impl-2.2.4.jar:]的com.sun中的<{} msgdata>. xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:258)[jaxb-impl-2.2.4.jar:] at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError (Loader.java:253)[jaxb-impl-2.2.4.jar:] at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:120)[jaxb-impl-2.2 .4.jar:] at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext $ DefaultRootLoader.childElement(UnmarshallingContext.java:1063)[jaxb-impl-2.2.4.jar:] at com.sun. xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:498)[jaxb-impl-2.2.4.jar:] at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement (UnmarshallingContext.java:480)[jaxb-impl-2.2.4.jar:] at com.sun.xml.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnm)arshaller.java:102)[jaxb-impl-2.2.4.jar:] at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:150)[jaxb-impl-2.2. 4.jar:] org.apache.xerces.parsers.AbstractSAXParser.startElement(未知来源)[xercesImpl-2.9.1.jar:] at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)[xercesImpl- 2.9.1.jar:] at org.apache.xerces.impl.XMLNSDocumentScannerImpl $ NSContentDispatcher.scanRootElementHook(未知来源)[xercesImpl-2.9.1.jar:] at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl $ FragmentContentDispatcher.dispatch(未知来源)[xercesImpl-2.9.1.jar:] org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(未知来源)[xercesImpl-2.9.1.jar:] at org.apache.xerces.parsers.XML11Configuration.解析(未知来源)[xercesImpl-2.9.1.jar:] atg.apache.xerces.parsers.XML11Configuration.parse(未知来源)[xercesImpl-2.9.1.jar:] at org.apache.xerces.parsers. XMLParser.parse(未知来源)[xercesImpl -2.9.1.jar:] org.apache.xerces.parsers.AbstractSAXParser.parse(未知来源)[xercesImpl-2.9.1.jar:] at org.apache.xerces.jaxp.SAXParserImpl $ JAXPSAXParser.parse(Unknown)来源)[xercesImpl-2.9.1.jar:] at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:217)[jaxb-impl-2.2.4.jar:] at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:189)[jaxax-impl-2.2.4.jar:] at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl .java:136)[jboss-jaxb-api_2.2_spec-1.0.3.Final.jar:1.0.3.Final]在javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:193)[jboss- jaxb-api_2.2_spec-1.0.3.Final.jar:1.0.3.Final] ......还有31个
我认为命名空间是在xml文档中定义的.我要么没有正确使用架构,要么命名空间定义不正确.我究竟做错了什么?
谢谢.
通常,对于如何访问Java Web应用程序中的文件(XSD或其他文件)(因为您提到了REST),您可以从这里开始.从不依赖绝对路径,部署以及安全原因.
xsi架构位置属性只是提示; 他们不是必需的.即使存在,也不必考虑.对于服务器端应用程序,我绝不会使用它们; 一个人应该依赖嵌入式资源,或者在可信/安全的位置使用类似目录的概念.
它没有解组的事实在错误消息中是清楚的:它期望无命名空间元素<{} msgdata>而不是<{ http://www.myCompany.com } msgdata>.
您需要修改XML或修改您的类以包含诸如@XmlElement(name ="...",namespace ="http://www.myCompany.com")之类的内容
我会说给定的架构和XML是正确的,你的注释是不同步的.
| 归档时间: |
|
| 查看次数: |
12468 次 |
| 最近记录: |