2017-04-13 57 views
0

是否可以創建一個用於驗證(未知)嵌套結構的XSD? 最近,我改變了我的XML數據是分層c#使用XSD在未知的嵌套元素上驗證XML

<root> 
    <record Object_Number="1" Object_Level="1" Object_Heading="Introduction" Object_Text="" Milestones="" Unique_ID="" Field_type="Info" SG_attribute="" Object_Identifier="1" Object_URL="doors://D1DDBAPP04:36677/?version=2&amp;prodID=0&amp;view=0000001a&amp;urn=urn:telelogic::1-432aa0956f684cff-O-1-00028f60"> 
     <record Object_Number="1.1" Object_Level="2" Object_Heading="What is " Object_Text="" Milestones="" Unique_ID="" Field_type="Info" SG_attribute="" Object_Identifier="23" Object_URL="doors://D1DDBAPP04:36677/?version=2&amp;prodID=0&amp;view=0000001a&amp;urn=urn:telelogic::1-432aa0956f684cff-O-23-00028f60"> 
      <record Object_Number="1.1.0-1" Object_Level="3" Object_Heading="" Object_Text="This document is, in fact, a database that summarizes specification and different aspects of diagnostic functions implemented in the system." Milestones="" Unique_ID="" Field_type="Info" SG_attribute="" Object_Identifier="24" Object_URL="doors://D1DDBAPP04:36677/?version=2&amp;prodID=0&amp;view=0000001a&amp;urn=urn:telelogic::1-432aa0956f684cff-O-24-00028f60"></record></record> 
     <record Object_Number="1.2" Object_Level="2" Object_Heading="Review Checklist" 

這是因爲原始數據是分層的,更有意義的利用XML嵌套的能力,而不是簡單的記錄。

所以現在我有嵌套

唯一已知的是,每個記錄有精確的屬性,我想檢查和現場錯誤,如果他們中的一個不正確的(不一致),屬性列表和/或不正確的值。

對於老(純記錄,而不是嵌套的)我用這個驗證

xdoc = XDocument.Load(myXml); 
        string xsdMarkup = @" 
<xs:schema attributeFormDefault='unqualified' elementFormDefault='qualified' xmlns:xs='http://www.w3.org/2001/XMLSchema'> 
    <xs:element name='root'> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element minOccurs='1' maxOccurs='unbounded' name='record'> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element minOccurs='1' maxOccurs='1' name='Object_Number' type='xs:string' /> 
       <xs:element minOccurs='1' maxOccurs='1' name='Object_Level' type='xs:unsignedByte' /> 
       <xs:element minOccurs='1' maxOccurs='1' name='Object_Heading' type='xs:string' /> 
       <xs:element minOccurs='1' maxOccurs='1' name='Object_Text' type='xs:string' /> 
       <xs:element minOccurs='1' maxOccurs='1' name='Milestones' type='xs:string' /> 
       <xs:element minOccurs='1' maxOccurs='1' name='Unique_ID' type='xs:string' /> 
       <xs:element minOccurs='1' maxOccurs='1' name='Field_type' type='xs:string' /> 
       <xs:element minOccurs='1' maxOccurs='1' name='SG_attribute' type='xs:string' /> 
       <xs:element minOccurs='1' maxOccurs='1' name='Object_Identifier' type='xs:unsignedShort' /> 
       <xs:element minOccurs='1' maxOccurs='1' name='Object_URL' type='xs:string' /> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
"; 
        XmlSchemaSet schemas = new XmlSchemaSet(); 
        schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup))); 

        string msg = ""; 
        xdoc.Validate(schemas, (o, err) => 
        { 
         msg += err.Message; 
         //Console.WriteLine("{0}", err.Message); 
         //errors = true; 
        }); 

        if (msg == "") 
         e.Result = true; 

我與Visual Studio生成的XSD架構。

現在,對於分層數據,生成的XSD似乎遵循的深層結構是罰款知道水平深處,但失敗的另一個深

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" name="record"> 
      <xs:complexType> 
      <xs:sequence minOccurs="0"> 
       <xs:element maxOccurs="unbounded" name="record"> 
       <xs:complexType> 
        <xs:sequence minOccurs="0"> 
        <xs:element maxOccurs="unbounded" name="record"> 
         <xs:complexType> 
         <xs:sequence minOccurs="0"> 
          <xs:element maxOccurs="unbounded" name="record"> 
          <xs:complexType> 
           <xs:attribute name="Object_Number" type="xs:string" use="required" /> 
           <xs:attribute name="Object_Level" type="xs:unsignedByte" use="required" /> 
           <xs:attribute name="Object_Heading" type="xs:string" use="required" /> 
           <xs:attribute name="Object_Text" type="xs:string" use="required" /> 
           <xs:attribute name="Milestones" type="xs:string" use="required" /> 
           <xs:attribute name="Unique_ID" type="xs:string" use="required" /> 
           <xs:attribute name="Field_type" type="xs:string" use="required" /> 
           <xs:attribute name="SG_attribute" type="xs:string" use="required" /> 
           <xs:attribute name="Object_Identifier" type="xs:unsignedShort" use="required" /> 
           <xs:attribute name="Object_URL" type="xs:string" use="required" /> 
          </xs:complexType> 
... 
... 
... 

因此,可以檢查嵌套方案與XSD?

非常感謝提示,

+0

XSD架構可以遞歸結構:http://stackoverflow.com/q/148988/891715 – Arie

回答

0

遞歸定義爲

<xs:element name="record"> 
    <xs:complexType> 
    <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
     <xs:element ref="record"/> 
     ....