Java 当模式具有elementFormDefault=";时,为什么不能在xml实例中使用默认名称空间;不合格;?
我有一个带有targetNamespace和非限定元素形式默认值的架构: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
<?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>