2017-04-13 4 views
0

Ist es möglich, eine XSD für die Validierung einer (unbekannten) verschachtelten Struktur zu erstellen? ich meine XML-Daten vor kurzem hierarchisch seinC# validate XML mit XSD für unbekannte verschachtelte Elemente

geändert
<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" 

Dies liegt daran, dass Originaldaten hierarchisch ist und Sinn macht XML verschachtelte Fähigkeit eher als einfache Aufzeichnungen zu nutzen.

So, jetzt habe ich

verschachtelt

Die einzige bekannte Sache ist, dass jeder Datensatz präzise Attribute haben, und ich möchte überprüfen und vor Ort Fehler, wenn einer von ihnen falsch haben (inkonsistent) Attributliste und/oder falsche Werte.

Für alte (plain Aufzeichnungen, nicht verschachtelt) Ich benutze diese

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; 

Das XSD-Schema I mit Visual Studio generiert für die Validierung.

Nun, für hierarchische Daten, erzeugt XSD die Tiefenstruktur zu folgen scheint, die für Know Ebene deeps in Ordnung ist, aber für einen anderen tiefen

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

So ist es möglich, eine verschachtelte Regelung nicht zu überprüfen mit XSD?

sehr vielen Dank für Hinweise,

+0

XSD-Schema rekursiv sein kann: http://stackoverflow.com/q/148988/891715 – Arie

Antwort

0

die Struktur definiert rekursiv

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