2014-09-26 45 views
0

我想創建一個xsd文件運行我們的web.config文件。我試圖抓住人爲錯誤並防止標籤嵌套。壞xml示例:xml架構驗證腳本阻止嵌套

<applicationSettings> 
    <app.MySettings> 
     <setting name="FirstName" serializeAs="String"> 
     <value>John</value> 
      <setting name="LastName" serializeAs="String"> 
       <value>Smith</value> 
      </setting> 
     </setting> 
    </app.MySettings> 
</applicationSettings> 

您會注意到設置「LastName」嵌套在「FirstName」中。正確的格式是:

<applicationSettings> 
    <app.MySettings> 
     <setting name="FirstName" serializeAs="String"> 
     <value>John</value> 
     </setting> 
     <setting name="LastName" serializeAs="String"> 
     <value>Smith</value> 
     </setting> 
    </app.MySettings> 
</applicationSettings> 

所以,我試圖創建一個模式來運行它反對。我有這個到目前爲止:

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="applicationSettings"> 
     <xs:complexType> 
      <xs:choice minOccurs="0" maxOccurs="1"> 
       <xs:sequence> 
        <xs:element name="app.mysettings"> 
         <xs:complexType> 
          <xs:choice minOccurs="0" maxOccurs="1"> 
           <xs:sequence> 
            <xs:element name="setting"> 
             <xs:complexType> 
              <xs:choice minOccurs="0" maxOccurs="1"> 
               <xs:sequence> 
                <xs:element type="xs:short" name="value"/> 
               </xs:sequence> 
               <xs:attribute type="xs:string" name="name"/> 
               <xs:attribute type="xs:string" name="serializeAs"/> 
              </xs:choice> 
             </xs:complexType> 
            </xs:element> 
           </xs:sequence> 
          </xs:choice> 
         </xs:complexType> 
        </xs:element> 
       </xs:sequence> 
      </xs:choice> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

有什麼不對,因爲我收回它的有效,它不應該是?如果這是做錯誤的方式(使用模式),請讓我知道更好的方法。

謝謝!

d^h

回答

1

一種更好的方式來設計架構上面的XML實例

<?xml version="1.0" encoding="UTF-8"?> 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns="http://example.com" 
targetNamespace="http://example.com" 
elementFormDefault="qualified" 
attributeFormDefault="unqualified"> 
<xs:element name="applicationSettings"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="app.MySettings"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 
<xs:element name="value" type="xs:short"/> 
<xs:element name="setting"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="value"/> 
     </xs:sequence> 
     <xs:attribute name="name" type="xs:string"/> 
     <xs:attribute name="serializeAs" type="xs:string"/> 
    </xs:complexType> 
</xs:element> 
<xs:element name="name" type="xs:string"/> 
<xs:element name="serializeAs" type="xs:string"/> 
<xs:element name="app.MySettings"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="setting" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 
+0

這將防止標籤的嵌套?你不需要關閉?使用 2014-09-29 14:31:30

+1

是的。如果您傳遞具有嵌套標記的實例,它將通過XML驗證錯誤。用更新了答案。 – Girish 2014-09-30 06:36:39

+0

這很好。謝謝! – 2014-09-30 14:11:57

0

回答有點正確,完整的模式是

<?xml version="1.0" encoding="UTF-8"?> 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" 
attributeFormDefault="unqualified"> 
    <xs:element name="applicationSettings"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="app.MySettings"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="value" type="xs:string"/> 
    <xs:element name="setting"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="value"/> 
      </xs:sequence> 
      <xs:attribute name="name" type="xs:string"/> 
      <xs:attribute name="serializeAs" type="xs:string"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="name" type="xs:string"/> 
    <xs:element name="serializeAs" type="xs:string"/> 
    <xs:element name="app.MySettings"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="setting" maxOccurs="unbounded"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema>