在另一个xsd中引用不同命名空间的本地元素?

在另一个xsd中引用不同命名空间的本地元素?,xsd,Xsd,需求是这样的,我只希望xsd中定义的一些元素可以作为根元素访问。 因此,为此,方法是通过声明复杂类型并引用它们,使所有其他元素成为本地元素 但是,如果在另一个xsd定义中需要这些不可访问或本地元素,换句话说,它们可以是属于在不同xsd中定义的某个其他命名空间的元素的子元素 如何实现这种模式定义 例如在下面的例子中 假设我只希望A:root和custom:root是有效的根,而不是inner:A,那么我在root元素下声明了innerA并引用了类型,而A:innerA可以在元素下 我无法在B.xs

需求是这样的,我只希望xsd中定义的一些元素可以作为根元素访问。 因此,为此,方法是通过声明复杂类型并引用它们,使所有其他元素成为本地元素

但是,如果在另一个xsd定义中需要这些不可访问或本地元素,换句话说,它们可以是属于在不同xsd中定义的某个其他命名空间的元素的子元素

如何实现这种模式定义

例如在下面的例子中 假设我只希望A:root和custom:root是有效的根,而不是inner:A,那么我在root元素下声明了innerA并引用了类型,而A:innerA可以在元素下

我无法在B.xsd中定义innerA,bcz它将使innerA位于B.xsd的targetnamespace中,即自定义命名空间中

例如

A.xsd


B.xsd


上面B.xsd中的最后第四行导致错误。如何引用innerA元素。有什么建议吗?

XML


简单回答,您不能引用本地声明的元素(想想Java或C#中的private)。如果它是全局元素,那么它可以是文档中的根元素。防止全局元素成为根元素的唯一方法是在验证程序中实现一个扩展,该扩展将检查根元素是什么。如果你想让你的方法更通用,你可以使用appinfo

假设您使用的是.NET。在使用XML之前,您可以检查文档元素的限定名,看看它是否在允许的列表中。您可以在单独的配置文件中配置此列表,也可以使用XSD本身。要验证XML,您必须在XmlSchemaSet中编译XSD;因此,如果您在appinfo中使用一些标记,那么您可以访问所有全局元素,检查该标记,找到后,将该元素的限定名添加到我上面提到的列表中

如果使用Java,您可以做类似的事情

如果您使用的语言不支持模式对象模型,那么可以将XSD作为XML文件处理。问题是它变得复杂了,因为您必须遍历include/imports,基本上您将自己解决外部引用

您必须记住的一点是,如果您最终使用的XSD不是您的XSD,而这些XSD使用的是全局元素,那么您对appinfo无能为力。您将坚持使用预配置的列表


没有联系,因为这是我自己对你问题的看法。如果您正在查找appinfo上的文档,请尝试。

hmm…您能否提供有关如何编写验证扩展的详细信息?应用信息?你能提供一些链接到你的答案吗?谢谢你的回答,我正在使用java,但我不想用java来处理这个问题。那么这可能吗?约束是这样的,我只需要在xsd中进行验证
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    targetNamespace="http://www.abc.com/custom"
    xmlns:A="http://www.abc.com/A" 
    xmlns:custom="http://www.abc.com/custom">
<xsd:import namespace="http://www.abc.com/custom"
        schemaLocation="B.xsd"/>

<xsd:complexType name="innerType">
   <xsd:sequence>
      <xsd:element name="abc" type="xs:string"/>
   </xsd:sequence>
</xsd:complexType>

<xsd:element name="root">
        <xsd:complexType mixed="true">
            <xsd:choice>
                <xsd:element ref="custom:root">
                 <xsd:element name="innerA" type="A:innerType"/>
            </xsd:choice>
        </xsd:complexType>
</xsd:element>
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    targetNamespace="http://www.abc.com/custom"
    xmlns:A="http://www.abc.com/A" 
    xmlns:custom="http://www.abc.com/custom">
<xsd:import namespace="http://www.abc.com/A"
        schemaLocation="A.xsd"/>
    <xsd:element name="root">
        <xsd:complexType mixed="true">
            <xsd:sequence>
                <xsd:element ref="A:innerA"/>
            </xsd:sequence>
        </xsd:complexType>
   </xsd:element>
 <A:root xmlns:A="http://www.abc.com/a" xmlns:custom="http://www.abc.com/custom"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation=""http://www.abc.com/a "http://www.abc.com/a/A.xsd">
    <custom:root>
       <A:innerA>
          <A:abc>
       </A:innerA>
    </custom:root>
    </A:hello>