加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用带有名称空间和模式的Jaxb进行XML解组

发布时间:2020-12-15 08:47:36 所属栏目:Java 来源:网络整理
导读:我有一个 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:msgidMsgID001
我有一个 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>

还向我发送了一个模式文档(称为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:tempmsgdata.xsd"));

final Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setSchema(schema);

return (T) unmarshaller.unmarshal(new StringReader(xml));

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;
    }

几个问题:

>我有一个休息服务,我将收到上面显示格式的XML文档.架构文档的参考是什么.我知道架构文档用于验证XML文档.我认为它的工作方式是我使用该模式来验证我通过REST服务收到的XML文档.现在的问题是我如何访问架构?我只是将它存储在我的文件系统上并访问它,如上所示?

XML文档具有对模式的引用(请参阅schemaLocation条目).它如何在我的文件系统上找到架构文档? XML文档中是否需要该模式引用?

>现在的XML文档无法解组.当我尝试解组时,我收到以下错误:

Caused by: javax.xml.bind.UnmarshalException: unexpected element
(uri:”http://www.myCompany.com”,local:”msgdata”). Expected elements
are <{}msgdata>
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:662)
[jaxb-impl-2.2.4.jar:]
at com.sun.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(ValidatingUnmarshaller.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:]
at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown
Source) [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(Unknown
Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown
Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown
Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) [xercesImpl-2.9.1.jar:]
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown
Source) [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)
[jaxb-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]
at 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 more

我认为命名空间是在xml文档中定义的.我要么没有正确使用架构,要么命名空间定义不正确.我究竟做错了什么?

谢谢.

解决方法

通常,对于如何访问Java Web应用程序中的文件(XSD或其他)(因为您提到了REST),您可以启动 here.从不依赖绝对路径,部署以及安全性原因.

xsi架构位置属性只是提示;他们不是必需的.即使存在,也不必考虑.对于服务器端应用程序,我绝不会使用它们;一个人应该依赖嵌入式资源,或者在可信/安全的位置使用类似目录的概念.

它没有解组的事实在错误消息中很清楚:它需要一个无命名空间的元素< {} msgdata>而不是< {http://www.myCompany.com} msgdata>.

您需要修改XML或修改您的类以包含诸如@XmlElement(name =“…”,namespace =“http://www.myCompany.com”)之类的内容

我会说给定的架构和XML是正确的,你的注释是不同步的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读