java - 创建 QName 时本地部分不能为 “null”

标签 java apache xsd qnames

我使用Apache XmlSchema 2.2.1解析 XSD 架构。我有以下架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.example.com/aigu"
       xmlns="http://www.example.com/aigu"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="2.0">
    <xs:attribute name="label" type="xs:string" />
    <xs:element name="object">
        <xs:complexType>
            <xs:attribute ref="label" form="unqualified"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

以下代码产生异常

import org.apache.ws.commons.schema.XmlSchemaCollection;
import org.xml.sax.InputSource;

import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;

public class Aigu {
    public static void main(String[] args) {
        String schema = "HERE_IS_CONTENT_OF_SCHEMA";
        XmlSchemaCollection collection = new XmlSchemaCollection();
        collection.read(new InputSource(new ByteArrayInputStream(schema.getBytes(StandardCharsets.UTF_8))));
    }
}

堆栈跟踪:

Exception in thread "main" java.lang.IllegalArgumentException: local part cannot be "null" when creating a QName
    at javax.xml.namespace.QName.<init>(QName.java:244)
    at javax.xml.namespace.QName.<init>(QName.java:188)
    at org.apache.ws.commons.schema.utils.XmlSchemaNamedWithFormImpl.setName(XmlSchemaNamedWithFormImpl.java:117)
    at org.apache.ws.commons.schema.utils.XmlSchemaNamedWithFormImpl.setForm(XmlSchemaNamedWithFormImpl.java:105)
    at org.apache.ws.commons.schema.XmlSchemaAttribute.setForm(XmlSchemaAttribute.java:170)
    at org.apache.ws.commons.schema.SchemaBuilder.handleAttribute(SchemaBuilder.java:959)
    at org.apache.ws.commons.schema.SchemaBuilder.handleAttribute(SchemaBuilder.java:923)
    at org.apache.ws.commons.schema.SchemaBuilder.handleComplexType(SchemaBuilder.java:307)
    at org.apache.ws.commons.schema.SchemaBuilder.handleElement(SchemaBuilder.java:420)
    at org.apache.ws.commons.schema.SchemaBuilder.handleSchemaElementChild(SchemaBuilder.java:1512)
    at org.apache.ws.commons.schema.SchemaBuilder.handleXmlSchemaElement(SchemaBuilder.java:659)
    at org.apache.ws.commons.schema.SchemaBuilder.build(SchemaBuilder.java:157)
    at org.apache.ws.commons.schema.XmlSchemaCollection.read(XmlSchemaCollection.java:508)
    at org.apache.ws.commons.schema.XmlSchemaCollection.read(XmlSchemaCollection.java:717)
    at org.apache.ws.commons.schema.XmlSchemaCollection.read(XmlSchemaCollection.java:565)
    at com.netcracker.mediation.transition.model.xmltojava.Aigu.main(Aigu.java:23)

这是 Apache 代码中的错误还是我的架构无效?

最佳答案

属性 form 不能在具有 ref 的属性使用中使用(如 this paragraph of the XML Schema specification 中的第 3.2 点所约束)。

此外,由于引用的目标是具有目标 namespace 的模式中的顶级属性声明,因此如果允许显式放置它,则其形式必须为合格

它可以解释该错误,因为跟踪似乎表明它发生在那里。

这将是更正后的架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.example.com/aigu"
    xmlns="http://www.example.com/aigu"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="2.0">
    <xs:attribute name="label" type="xs:string" />
    <xs:element name="object">
        <xs:complexType>
            <xs:attribute ref="label"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

关于java - 创建 QName 时本地部分不能为 “null”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45693363/

相关文章:

java - 具有 ActiveMQ 代理网络的 JMS 消费者

java - Tomcat 和 Ajax 问题

xml - 模式 1.1 的 lxml

jaxb - 如何让我的 JAXB 输出包含对创建它的 XSD 的引用?

java.util.Calendar.setTime 处的 java.lang.NullPointerException

java - 如何使用 Retrofit 而不是 Volley 将图像发送到我的服务器?

php - 'www' 文件夹和 'htdocs' 文件夹有什么区别?

默认命名空间中的 XML 属性名称和元素?

java - Android 垃圾收集器行为

apache - 在 Apache 上设置 ECDSA 并获取 SSL_ERROR_NO_CYPHER_OVERLAP