当前位置: 首页 > 知识库问答 >
问题:

JAXB XSD命名空间散集返回null

欧阳成弘
2023-03-14

我想将一个xml文件映射到Java对象。我有一个验证xml的模式。

爪哇类

Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(
                new File("src/PersonDetails.xsd"));
jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setSchema(schema);
Person response = (Person ) unmarshaller.unmarshal(newFileInputStream("src/PersonDetails.xml"));
System.out.println(response.getPersonNo());

PersonDetails.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.example.com"
    targetNamespace="http://www.example.com" elementFormDefault="qualified"
    version="1-0-20101115" id="PersonDetails">
    <xs:element name="PersonDetails">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="PersonNo" nillable="false">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:maxLength value="30" />
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

个人详细信息.xml

<?xml version="1.0" encoding="UTF-8"?>
<PersonDetails xmlns="http://www.example.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com PersonDetails_v1-0-20101115.xsd">
    <PersonNo>PERS-0001-000001</PersonNo>
</PersonDetails>

个人.class

@XmlRootElement(name = "PersonDetails", namespace="http://www.example.com")
public class Person {
  private String personNo;

  @XmlElement(name = "PersonNo")
  public String getPersonNo(){
     return personNo;
  }
}

personNo返回null。如果我从xsd和xml中删除名称空间和xmlns声明,我可以得到正确的值。

当我尝试使用相同的模式进行Marshall时,我收到了以下错误:

javax.xml.bind.MarshalException
 - with linked exception:
[org.xml.sax.SAXParseException; lineNumber: 0; columnNumber: 0; cvc-complex-type.2.4.a: Invalid content was found starting with element 'PersonNo'. One of '{"http://www.example.com":PersonNo}' is expected.]
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(Unknown Source)
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(Unknown Source)
    at Test.main(Test.java:35)

共有1个答案

越姚石
2023-03-14

我遇到了同样的问题。我通过这个回答解决了问题。

解决方案是使用包上的@XmlSchema批注创建包信息.java文件。

package-info.java

XmlSchema( 
    namespace = "http://www.ba.com/schema/BAserviceDeskAPI/incident", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package example;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
 类似资料:
  • 关于术语的一点说明: 请务必注意一点,TypeScript 1.5里术语名已经发生了变化。 “内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”,这是为了与ECMAScript 2015里的术语保持一致,(也就是说 module X { 相当于现在推荐的写法 namespace X {)。 这篇文章描述了如何在TypeScript里使用命名空间(之前叫做“内部模块”)来组织你的代码

  • Let the word of Christ dwell in you richly in all wisdom; teaching and admonishing one another in psalms and hymns and spiritual songs, singing with grrace in your hearts tto the Lord. And whatsoever

  • 客户端有许多“命名空间”,通常是一些公开的可管理功能。命名空间对应 Elasticsearch 中各种可管理的 endpoint。下面是全部的命名空间: **命名空间** **功能** `indices()` 索引数据统计和显示索引信息 `nodes()` 节点数据统计和显示节点信息 `cluster()` 集群数据统计和显示集群信息 `snapshot()` 对集群和索引进行拍摄快照或恢复数据

  • 命名空间 由于 js 环境极少命名空间管理模块, namespace 相对陌生, 比如有这样的文件结构, src/ demo/ core.cljs 可以看到 core.cljs 的路径就是: src/demo/core.cljs 注意 JVM 环境有个 classpath 的环境变量, 用于判断怎样查找源码, classpath 对应多个路径, 也可能是 jar 包, 而 jar 包中

  • 命名空间,英文名字:namespaces 在研习命名空间以前,请打开在python的交互模式下,输入:import this >>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than

  • Swoole提供了完善的进程管理机制,当Worker进程异常退出,如发生PHP的致命错误、被其他程序误杀,或达到max_request次数之后正常退出。主进程会重新拉起新的Worker进程。 Worker进程内可以像普通的apache+php或者php-fpm中写代码。不需要像Node.js那样写异步回调的代码。 主进程内的回调函数: onStart onShutdown onTimer Work