【问题标题】:XML Schema: Namespace issues when importing shared elementsXML Schema:导入共享元素时的命名空间问题
【发布时间】:2010-04-14 12:01:33
【问题描述】:

当尝试从 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”)——这里有什么问题的提示吗?

【问题讨论】:

    标签: xml xsd xml-namespaces xml-validation xml-import


    【解决方案1】:

    您正在引用fooElement,就好像它不在命名空间中一样,您需要在实例文档中使用正确的命名空间:

    <?xml version="1.0"?>
    <example
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                     
      xsi:noNamespaceSchemaLocation="example.xsd" xmlns:shared="http://shared.com">
        <importedElement>
            <shared:fooElement>42</shared:fooElement>
        </importedElement>
        <importedType>
            <bar>42</bar>
        </importedType>
    </example>
    

    编辑:我应该指出:这就是 typeselements 之间的区别;只有后者出现在文档中(有一些例外),这就是为什么您的导入类型可以按您的意愿工作,而您的元素却不能。

    【讨论】:

    • 我接受了您的回答,因为它解决了我的问题。不幸的是,它并没有解决我的问题:XML 实例文档是在客户那里部署的,不能更改它们。任何允许从共享 XSD 导入元素的命名空间魔法不需要在 XML 实例中进行调整?
    • 那么,是什么让您首先将命名空间分配给共享模式?是否有某种授权?你为什么不让你的共享模式像你的邮件一样没有命名空间,并使用包含而不是导入?
    • 稍后我们将使用 JAXB 访问 XML 文档。通过导入,共享类型的 Java 对应物不是真正共享的,而是为每个 XSD 重新生成,因此很难围绕它们编写实用程序代码。
    • 我猜您的意思是“包含”,因为您当前提议的架构使用导入? :) 使用包含,您可以在绑定文件中指定共享(包含)模式中的所有类最终都在某个包中。所以,是的,如果另一个模式使用共享元素,它们将被覆盖,但它们将保持相同的类。这对你有用吗?
    • 是的,这可行,我会试一试 -- 感谢您的帮助!
    猜你喜欢
    • 2012-01-11
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2016-05-12
    • 2018-01-06
    • 1970-01-01
    • 2011-04-06
    • 2023-03-09
    相关资源
    最近更新 更多