Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当模式具有elementFormDefault=";时,为什么不能在xml实例中使用默认名称空间;不合格;?_Java_Xml_Xsd_Jaxb - Fatal编程技术网

Java 当模式具有elementFormDefault=";时,为什么不能在xml实例中使用默认名称空间;不合格;?

Java 当模式具有elementFormDefault=";时,为什么不能在xml实例中使用默认名称空间;不合格;?,java,xml,xsd,jaxb,Java,Xml,Xsd,Jaxb,我有一个带有targetNamespace和非限定元素形式默认值的架构: <?xml version="1.0" encoding="UTF-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://shiporder.hu/Shiporder" xmlns="http://shiporder.hu/Shiporder" elementFor

我有一个带有targetNamespace和非限定元素形式默认值的架构:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://shiporder.hu/Shiporder" 
    xmlns="http://shiporder.hu/Shiporder"
    elementFormDefault="unqualified">
    <xs:complexType name="shipordertype">
        <xs:sequence>
            <xs:element name="orderid" type="xs:string" />
        </xs:sequence>
    </xs:complexType>
    <xs:element name="shiporder" type="shipordertype" />
</xs:schema>

我不明白为什么以下实例无效:

<?xml version="1.0" encoding="UTF-8"?>
<shiporder 
xmlns="http://shiporder.hu/Shiporder" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://shiporder.hu/Shiporder shiporder_unqualified.xsd">
  <orderid>123456</orderid>
</shiporder>

123456
Jaxb验证说“发现了以元素'orderid'开头的无效内容。应该是{orderid}中的一个。”我对这条消息特别困惑,如果应该是“orderid”,那么“orderid”有什么问题

这是验证错误:

org.xml.sax.SAXParseException;systemId:file:/home/riskop/git/xml\u schema\u elementformdefault\u question/src/main/resources/order\u unqualified\u with\u default\u ns.xml;行号:6;列数:12;cvc复杂类型.2.4.a:发现以元素“orderid”开头的内容无效。应为“{orderid}”之一。 位于com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203) 在

我有一个关于github的小演示:


请尝试以下实例之一:

<shiporder 
    xmlns="http://shiporder.hu/Shiporder"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://shiporder.hu/Shiporder shiporder_unqualified.xsd">
    <orderid>123456</orderid>
</shiporder>

123456


123456

elementFormDefault
不做你认为它做的事;请参阅例如,以获取解释。

如果验证器不仅告诉您它期望的是什么,还告诉您它发现了什么,那么您将更容易看到发生了什么

您的模式声明扩展名为
{http://shiporder.hu/Shiporder}shiporder的类型为
{http://shiporder.hu/Shiporder}shipordertype
。与该类型的所有元素一样,它被声明为只有一个子元素,其扩展名为
{}orderid
。(或者,在您的验证器显然使用的符号中,
{orderid}

实例中的外部元素具有扩展名称
{http://shiporder.hu/Shiporder}shiporder
但它不遵守约束:它有一个子元素,但该子元素具有扩展名
{http://shiporder.hu/Shiporder}医嘱ID
。(或者,在您的验证器明显使用的符号中,
http://shiporder.hu/Shiporder{orderid}

如果希望实例看起来像此示例实例,最简单的修复方法是将elementFormDefault更改为“qualified”。但也可以将实例更改为

<?xml version="1.0" encoding="UTF-8"?>
<shiporder 
  xmlns="http://shiporder.hu/Shiporder" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://shiporder.hu/Shiporder 
  shiporder_unqualified.xsd">
    <orderid xmlns="">123456</orderid>
</shiporder>

123456

如果您对刚才给出的解释的反应不是一记伴随着“D'oh!”的耳光,那么您可能需要回顾一下术语“[namespace-]qualified”和“[namespace-]unqualified”的含义以及默认和其他名称空间声明的含义。

McQueen的回答很有启发性,谢谢

我想总结一下这一点和我的理解:

  • 模式中的elementFormDefault=“unqualified”指定了两件事:
  • 全局声明的元素必须在实例中显式限定
  • 本地声明的元素不能在实例中限定
  • 元素“orderid”是架构中本地声明的元素,因此实例中不能限定“orderid”
  • 实例中的元素“shiporder”正在指定一个默认名称空间,因此它的所有子元素都将被限定,因此实例中的“orderid”是限定的,这与上面的第二点相矛盾
  • 这回答了我的问题

    我仍然认为JAXB验证消息是令人费解和神秘的:“发现了以元素'orderid'开头的无效内容。应为'{orderid}'中的一个。'{orderid}'的表达方式与'{}orderid'的表达方式不同,而且我错过了消息中的实际元素。我希望看到这样的情况:“从'orderid'开始的内容无效:实际:'{}orderid',预期:'{}orderid'。这基本上是McQueen在回答中首先说的

    无论如何,实例中可能的修复方法是在“orderid”元素(
    )中取消名称空间的定义:

    
    123456
    
    或不使用默认命名空间:

    <q:shiporder 
        xmlns:q="http://shiporder.hu/Shiporder"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://shiporder.hu/Shiporder shiporder_unqualified.xsd">
        <orderid >123456</orderid>
    </q:shiporder>
    
    
    123456
    
    架构中可能的修复方法是将其更改为合格:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://shiporder.hu/Shiporder" 
        xmlns="http://shiporder.hu/Shiporder"
        elementFormDefault="qualified">
        <xs:complexType name="shipordertype">
            <xs:sequence>
                <xs:element name="orderid" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
        <xs:element name="shiporder" type="shipordertype" />
    </xs:schema>
    
    
    
    或更改为(“unqualified”对全局声明的元素没有影响,在这种情况下,“orderid”与“shiporder”是全局声明的):

    
    


    请注意,我同意在架构中为elementFormDefault指定“qualified”几乎总是正确的做法…

    感谢您的回答!您的第一个实例验证失败,原因是…行号:6;列号:14;cvc复杂类型。2.4.a:发现以元素“orderid”开头的内容无效。{orderid}应为“”。您的第二个实例失败,“…行号:6;列号:16;cvc复杂类型。2.4.a:发现以元素“q:orderid”开头的内容无效。应为“{orderid}”之一。”大致正确,但措辞有点奇怪。模式定义了一组有效的文档;它没有说您或您的文档必须做或不做任何事情;您的文档是有效的还是无效的都非常满意。设置elementFormDefault对所有本地元素都有影响这一点也不完全正确;默认值可以是ove如果考虑模式和文档实例中给出的元素的扩展名,那么规则更简单:实例元素只有在具有相同(扩展)名称时才匹配声明。
    <q:shiporder 
        xmlns:q="http://shiporder.hu/Shiporder"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://shiporder.hu/Shiporder shiporder_unqualified.xsd">
        <orderid >123456</orderid>
    </q:shiporder>
    
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://shiporder.hu/Shiporder" 
        xmlns="http://shiporder.hu/Shiporder"
        elementFormDefault="qualified">
        <xs:complexType name="shipordertype">
            <xs:sequence>
                <xs:element name="orderid" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
        <xs:element name="shiporder" type="shipordertype" />
    </xs:schema>
    
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://shiporder.hu/Shiporder" 
        xmlns="http://shiporder.hu/Shiporder"
        elementFormDefault="unqualified">
        <xs:complexType name="shipordertype">
            <xs:sequence>
                <xs:element ref="orderid" />
            </xs:sequence>
        </xs:complexType>
        <xs:element name="shiporder" type="shipordertype" />
        <xs:element name="orderid" type="xs:string" />
    </xs:schema>