0

对于以下 XSD 文件:

    <?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="stringtype">
  <xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="inttype">
  <xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>
<xs:simpleType name="dectype">
  <xs:restriction base="xs:decimal"/>
</xs:simpleType>
<!-- Tokens -->
<xs:complexType name="RelativeText">
    <xs:attribute name="name" type="stringtype" use="required"/>
    <xs:attribute name="flow" type="stringtype" use="required"/>
    <xs:attribute name="amount" type="inttype"  use="required"/>
</xs:complexType>
<xs:complexType name="LineText">
    <xs:attribute name="name" type="stringtype" use="required"/>
</xs:complexType>
<xs:complexType name="BoxText">
    <xs:attribute name="name" type="stringtype" use="required"/>
    <xs:attribute name="width" type="dectype" use="required" />
    <xs:attribute name="height" type="dectype" use="required" />
    <xs:attribute name="x" type="dectype" use="required" />
    <xs:attribute name="y" type="dectype" use="required" />
</xs:complexType> 
<!-- Settings -->
<!-- Local Settings - per file type -->
<!-- Directories  -->
<xs:complexType name="MonitorDirectoryElementType">
    <xs:attribute name="path" type="stringtype" use="required"/>
</xs:complexType>

<xs:complexType name="OutputDirectoryElementType">
    <xs:attribute name="path" type="stringtype" use="required"/>
</xs:complexType>

<xs:complexType name="LoggingDirectoryElementType">
    <xs:attribute name="path" type="stringtype" use="required"/>
</xs:complexType>

<xs:complexType name="FileExtensionElementType">
    <xs:attribute name="extension" type="stringtype" use="required"/>
</xs:complexType>

<xs:complexType name="LocalSettingsType">
     <xs:all>
        <xs:element name="file-type" type="FileExtensionElementType" maxOccurs="1"/>
        <xs:element name="monitor-directory" type="MonitorDirectoryElementType" maxOccurs="1"/>
        <xs:element name="output-directory" type="OutputDirectoryElementType" maxOccurs="1"/>
        <xs:element name="log-directory" type="LoggingDirectoryElementType" maxOccurs="1"/>
     </xs:all>
</xs:complexType>
<!-- Global Settings -->
<xs:complexType name="ApplicationLogFileType">
    <xs:attribute name="path" type="stringtype" use="required"/>
</xs:complexType>

<xs:complexType name="GlobalSettingsType">
    <xs:all>
        <xs:element name="log-file" type="ApplicationLogFileType" maxOccurs="1"/>
    </xs:all>
</xs:complexType>
<!-- Token Type Wrap Around -->
<xs:complexType name="TokensType">
    <xs:choice maxOccurs="unbounded">
        <xs:element name="line-text" type="LineText" />
        <xs:element name="box-text" type="BoxText" />
        <xs:element name="relative-text" type="RelativeText" />
    </xs:choice>
</xs:complexType>
<!-- Template content -->
<xs:complexType name="templatecontenttype">
    <xs:all>
        <xs:element name="local-settings" type="LocalSettingsType" maxOccurs="1" />
        <xs:element name="tokens" type="TokensType" maxOccurs="1"/>
    </xs:all>
</xs:complexType>
<!-- Main application settings -->
<xs:complexType name="ApplicationConfigurationType">
    <xs:choice maxOccurs="unbounded">
        <xs:element name="global-settings" type="GlobalSettingsType" maxOccurs="1"/>
        <xs:element name="template-content" type="templatecontenttype"  />
    </xs:choice>
</xs:complexType>
<xs:element name="ApplicationConfiguration" type="ApplicationConfigurationType"  />
</xs:schema>

我希望能够与这样的 xml 一起使用:

    <?xml version='1.0'?>
<ApplicationConfiguration>
    <global-settings >
        <log-file path="D:\applicationLog.log" />
    </global-settings>
    <template-content>
        <local-settings>
            <file-type extension=".txt" />
            <monitor-directory path="D:\monitor\"/>
            <output-directory path="D:\output"/>
            <log-directory path= "D:\ThisInstanceLogs"/>
        </local-settings>
        <tokens>
            <line-text name="xyz1" />
            <line-text name="xyz12" />
            <relative-text name="xyz123" flow="below" amount="1"/>
            <line-text name="xyz1234" />
            <line-text name="xyz12345" />
            <box-text name="thada" width="100" height="100" x="2" y="3"/>
        </tokens>
    </template-content>
</ApplicationConfiguration>

在哪里

  • 全局设置只能出现一次

  • 模板内容 = 无限次

  • 本地设置和令牌 - 每个一次

  • 令牌中的元素 = 以任何顺序无限制(甚至 0 次出现)

  • 日志文件一次&强制

    . 我觉得我在这里做错了很多事情..

4

1 回答 1

2

问题是您有一个xs:element未关闭的标签:

<xs:element name="LocalSettings" type="LocalSettingsType" maxOccurs="1">

我还在本节中看到了错误:

<xs:complexType name="ApplicationConfigurationType">
    <xs:all >
        <xs:element name="global-settings" type="" maxOccurs="1"/>
        <xs:element name="template-content" type="templatecontenttype"  maxOccurs="unbounded"/>
    </xs:all>
</xs:complexType>

type属性不应为空,并且元素组中的maxOccurs必须为 0 或 1 。xs:all

为了满足您的要求,我认为该部分的架构应如下所示:

<xs:complexType name="ApplicationConfigurationType">
    <xs:choice minOccurs="0">
        <xs:sequence>
            <xs:element name="global-settings" type="GlobalSettingsType" />
            <xs:element name="template-content" type="templatecontenttype"
              minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:sequence>
            <xs:element name="template-content" type="templatecontenttype"
              maxOccurs="unbounded" />
            <xs:sequence minOccurs="0">
                <xs:element name="global-settings" type="GlobalSettingsType" />
                <xs:element name="template-content" type="templatecontenttype"
                  minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:sequence>
    </xs:choice>
</xs:complexType>

在顶层,您可以选择 - 您的第一个元素将是global-settings(第一个序列)或template-content(第二个序列)。

如果第一个元素是global-settings,那么它后面可以跟 0 个或多个template-content元素,这就是它的全部内容。

如果第一个元素是template-content,则可能有很多(因此它是无界的)。并且它可以选择跟随一个global-settings元素(嵌套序列)。如果有一个global-settings元素,那么后面可能会跟着 0 个或多个附加template-content元素。

我认为这涵盖了所有可能性。两者都是可选的global-settingstemplate-content最多可以有一个global-settings元素。它们可以以任何顺序出现。

于 2013-07-01T17:46:35.000 回答