【问题标题】:Struggling with XSD schema与 XSD 架构作斗争
【发布时间】:2014-06-17 20:31:33
【问题描述】:

我有以下 XML 文档,有点简单:

<configuration>
   <group name="database">
        <server name="machine01" user="root" password="foob4r" sudo="true" hdd="300" loc="/opt" />
   </group>
   <group name="application">
        <server name="machine01" user="root" password="foob4r" sudo="true" hdd="50" loc="/export" />
        <server name="machine02" user="root" password="foob5r" sudo="true"/>
   </group>
   <group name="profiler">
        <server name="machine03" user="root" password="blue123"/>
        <server name="machine03" />
   </group>
</configuration>

&lt;configuration&gt; 属性是必须,并且至少一个 &lt;group&gt;至少一个 &lt;server&gt; 是一个必须。 在服务器中,只有name 属性是必须的。

我想出了:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="configuration">
    <xsd:complexType>
          <xsd:element name="group">
            <xsd:complexType>
                <xsd:element name="server">
                    <xsd:attribute name="name" type="xsd:string" use="required" />
                    <xsd:anyAttribute/>
                </xsd:element>
            </xsd:complexType>
          </xsd:element>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

遗憾的是,这并不能解决问题。

【问题讨论】:

  • &lt;configuration&gt; 是什么意思 属性 是必须的? &lt;configuration&gt; 是一个元素,它在您的实例和架构中都没有任何属性。我相信你的意思是元素

标签: xml xsd xsd-validation


【解决方案1】:

如果你可以有许多&lt;group&gt;子元素,那么你必须声明maxOccurs="unbounded",因为默认,当maxOccurs不存在时,是@ 987654324@。

<xsd:element minOccurs="1" maxOccurs="unbounded" name="group"> ...

&lt;server&gt; 相同。在您的架构中,它仅声明 minOccurs="1"。如果您有多个,则需要添加maxOccurs。 (如果只允许 2 个服务器,您也可以使用一个固定值,例如 maxOccurs="2"。)属性 minOccurs="1" 保证至少有一个 &lt;group&gt; 和必须至少存在一个&lt;server&gt;

对于属性,您需要指定它们不会被验证。当您使用xsd:anyAttribute 时,您可以使用processContents="lax"processContents="skip" 来做到这一点:

<xsd:anyAttribute processContents="lax"/>

就是这样。带有这些更正的 XSD 如下所示,它应该验证您的实例:

<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <xsd:element name="configuration">
        <xsd:complexType>
            <xsd:sequence>

                <xsd:element minOccurs="1" maxOccurs="unbounded" name="group">
                    <xsd:complexType>
                        <xsd:sequence>

                            <xsd:element name="server" minOccurs="1" maxOccurs="unbounded">
                                <xsd:complexType>
                                    <xsd:attribute use="required" name="name" type="xsd:string" />
                                    <xsd:anyAttribute processContents="lax"/>
                                </xsd:complexType>
                            </xsd:element>

                        </xsd:sequence>
                        <xsd:attribute name="name" type="xsd:string" />
                    </xsd:complexType>
                </xsd:element>

            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

【讨论】:

  • 我已将 use="required" 添加到 属性,现在它可以解决问题了。谢谢!
  • 谢谢。我忘记了那个细节。修好了。
【解决方案2】:

我猜你的 XSD 中缺少 maxOcuurs

<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="configuration">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element minOccurs="1" name="group" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="server" minOccurs="1" maxOccurs="unbounded">
                            <xsd:complexType>
                                <xsd:attribute name="name" type="xsd:string" />
                                <xsd:anyAttribute/>
                            </xsd:complexType>
                        </xsd:element>
                    </xsd:sequence>
                    <xsd:attribute name="name" type="xsd:string" />
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
 </xsd:element>
 </xsd:schema>

【讨论】:

    猜你喜欢
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2013-12-06
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多