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

时间:2012-06-14 23:58:52

标签: xsd

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

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

如何实现这种架构定义?

例如,以下内容 说我只希望 A:root和custom:root 是有效的根而不是内部:A ,所以我在根元素下声明了innerA并引用了类型,而A: innerA可以归入元素吗?

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

例如

A.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>

B.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/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>

B.xsd以上的第四行导致错误。我怎样才能引用innerA元素。任何建议?

XML

 <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>

1 个答案:

答案 0 :(得分:0)

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

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

如果是Java,你可以做类似的事情。

如果您正在处理不支持架构对象模型的语言,那么您可以将XSD处理为XML文件。这个问题是它变得复杂,因为你必须遍历包含/导入,基本上你最终会自己处理解析外部引用。

您必须记住的一件事是,如果您最终使用的不是您的XSD,但是那些XSD使用的是全局元素,那么您无法使用appinfo做任何事情。你坚持使用预先配置的列表。

没有链接,因为这是我自己的想法。如果您正在寻找有关appinfo的文档,请尝试this one