XML架构:导入共享元素时的命名空间问题

XML架构:导入共享元素时的命名空间问题,xml,xsd,xml-namespaces,xml-validation,xml-import,Xml,Xsd,Xml Namespaces,Xml Validation,Xml Import,尝试从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"> &

尝试从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”开头的无效内容。应为“{:fooElement}”之一

我猜我的问题与名称空间问题有关,因此在某种程度上误导了Get fooElement,但却期待着fooElement-这里有什么问题吗?

如果引用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>

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

我接受了您的答案,因为它解决了我的问题。不幸的是,这并不能解决我的问题:XML实例文档是在客户处部署的,不能更改它们。有什么名称空间魔法可以允许从共享XSD导入元素而不需要在XML实例中进行调整吗?那么,是什么让您首先将名称空间分配给共享模式的呢?有什么授权吗?为什么不让共享模式没有像邮件那样的名称空间,并使用include而不是import呢?稍后我们将使用JAXB访问XML文档。使用导入时,共享类型的Java对应项不是真正共享的,而是为每个XSD重新生成的,这使得围绕它们编写实用程序代码变得困难。我猜您的意思是使用包含,因为您当前提出的模式使用导入:使用include,您可以在绑定文件中指定来自共享include模式的所有类最终都位于某个包中。因此,是的,如果另一个模式使用共享元素,它们将被覆盖,但它们将保持相同的类。那对你有用吗?是的,可以,我会试试看-谢谢你的帮助!