0

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

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

如何实现这种模式定义?

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

我无法在 B.xsd 中定义 innerA,bcz它将使 innerA 位于 B.xsd 的 targetnamespace 即 custom namespace中。

例如

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

1 回答 1

0

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

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

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

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

您必须记住的一件事是,如果您最终使用不属于您的 XSD,但这些 XSD 使用全局元素,那么您对 ​​appinfo 无能为力。您坚持使用预先配置的列表。

没有链接,因为这是我自己对您的问题的想法。相反,如果您正在寻找有关 appinfo 的文档,那么试试这个

于 2012-06-15T00:27:08.803 回答