XML 架构:导入共享元素时的命名空间问题
当尝试从 XML 架构导入共享定义时,我可以正确引用共享类型,但引用共享元素会导致验证错误。
这是导入共享定义 (example.xsd) 的架构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:shared="http://shared.com">
<xs:import namespace="http://shared.com" schemaLocation="shared.xsd"/>
<xs:element name="example">
<xs:complexType>
<xs:sequence>
<xs:element ref="importedElement"/>
<xs:element ref="importedType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="importedElement">
<xs:complexType>
<xs:sequence>
<xs:element ref="shared:fooElement"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="importedType">
<xs:complexType>
<xs:sequence>
<xs:element name="bar" type="shared:barType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
这些是共享定义 (shared.xsd):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://shared.com"
targetNamespace="http://shared.com">
<xs:element name="fooElement">
<xs:simpleType>
<xs:restriction base="xs:integer"/>
</xs:simpleType>
</xs:element>
<xs:simpleType name="barType">
<xs:restriction base="xs:integer"/>
</xs:simpleType>
</xs:schema>
现在考虑这个 XML 实例:
<?xml version="1.0"?>
<example
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="example.xsd">
<importedElement>
<fooElement>42</fooElement>
</importedElement>
<importedType>
<bar>42</bar>
</importedType>
</example>
验证后,“importedType”工作得很好,但“importedElement”给出了以下错误:
发现以元素“fooElement”开头的无效内容。预计为 '{"http://shared.com":fooElement}' 之一
我猜我的麻烦是与命名空间问题相关(因此有某种误导性的“得到 fooElement 但期待 fooElement”)——有什么关于这里问题的提示吗?
When trying to import shared definitions from a XML Schema, I can properly reference shared types, but referencing shared elements causes validation errors.
This is the schema that imports the shared definitions (example.xsd):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:shared="http://shared.com">
<xs:import namespace="http://shared.com" schemaLocation="shared.xsd"/>
<xs:element name="example">
<xs:complexType>
<xs:sequence>
<xs:element ref="importedElement"/>
<xs:element ref="importedType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="importedElement">
<xs:complexType>
<xs:sequence>
<xs:element ref="shared:fooElement"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="importedType">
<xs:complexType>
<xs:sequence>
<xs:element name="bar" type="shared:barType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
These are the shared definitions (shared.xsd):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://shared.com"
targetNamespace="http://shared.com">
<xs:element name="fooElement">
<xs:simpleType>
<xs:restriction base="xs:integer"/>
</xs:simpleType>
</xs:element>
<xs:simpleType name="barType">
<xs:restriction base="xs:integer"/>
</xs:simpleType>
</xs:schema>
Now consider this XML instance:
<?xml version="1.0"?>
<example
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="example.xsd">
<importedElement>
<fooElement>42</fooElement>
</importedElement>
<importedType>
<bar>42</bar>
</importedType>
</example>
When validated, the "importedType" works perfectly fine, but the "importedElement" gives the following error:
Invalid content was found starting with element 'fooElement'. One of '{"http://shared.com":fooElement}' is expected
I would guess that my troubles are related to namespace issues (hence the somehow misleading "got fooElement but was expecting fooElement") -- any hints on what's wrong here?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您引用
fooElement
就好像它不在命名空间中一样,您需要在实例文档中使用正确的命名空间:编辑: 我应该指出:这就是之间的区别类型和元素;只有后者出现在文档中(有一些例外),这就是为什么您导入的类型可以按您想要的方式工作,而您的元素却不能。
You are referencing
fooElement
as if it was in no namespace, you need to use the correct namespace in your instance document:Edit: I should have pointed out: that's the differences between types and elements; only the latter appear in documents (with some exceptions), that's why your imported type works as you wanted, and your element does not.