2016-11-01 4 views
1

Ich möchte überprüfen oder finden Sie ein Element in XSD-Datei vorhanden.Suchen/Validieren Element in XSD

Mein XSD-Schema sieht wie folgt:

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

<!-- XSD --> 
<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://integration.cbre.com/schemas/gws/processinvoice/v1" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:simpleType name="Type_DATE"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]"/> 
    </xs:restriction> 
    </xs:simpleType> 
    <xs:complexType name="Type_Document1"> 
    <xs:sequence> 
     <xs:element name="ID" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="Name" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="Address" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="City" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="State" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     <xs:element name="Comments" type="xs:string" minOccurs="0" maxOccurs="1"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="Type_Document2"> 
     <xs:sequence> 
      <xs:element name="Sender" type="Type_Document1" minOccurs="0" maxOccurs="1"/> 
      <xs:element name="Receiver" type="xs:string" minOccurs="0" maxOccurs="1"/> 
      <xs:element name="Email" type="xs:string" maxOccurs="1"/> 
      <xs:element name="Type" type="xs:string" maxOccurs="1"/> 
      <xs:element name="Remarks" type="Type_Document3" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="Type_Document3"> 
     <xs:sequence> 
      <xs:element name="Phone" type="xs:string" minOccurs="0" maxOccurs="1"/> 
      <xs:element name="Fax" type="xs:string" minOccurs="0" maxOccurs="1"/> 
      <xs:element name="Email" type="xs:string" minOccurs="0" maxOccurs="1"/> 
      <xs:element name="Address" type="xs:string" minOccurs="0" maxOccurs="1"/> 
      <xs:element name="Comments" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 

</xs:schema> 

Jetzt in C# oder vb.net Ich muss überprüfen, ob bestimmte Feld in XSD-Schema existieren.

z.B. wenn ich Parameter an eine Funktion folgende passieren sollte es wahr

  • ValidateColumn ("Type_Document1", "Staat") zurückkehren
  • ValidateColumn ("Dokument1", "State")

// Sollte verwenden wie mit Type_Document1 passen, wenn wir Document1

bestanden
Function ValidateColumn(Type as string, Element as string) as boolean 
End Function 

Aber wenn Pass folgenden dann sollte es diese Elemente false zurück gibt es nicht.

  • ValidateColumn ("Type_Document2", "Bezeichnung")
  • ValidateColumn ("Document2", "Titel")

Antwort

0

Hier einige VB.NET-Code, den Sie gehen zu bekommen:

Dim dataSet As Data.DataSet = New Data.DataSet 

'add xsd with tables and columns into data table 

dataSet.ReadXmlSchema(params.XsdPath) 

'loop through each table and col 
For Each dtable As Data.DataTable In DataSet.Tables 
    For Each col As Data.DataColumn In dtable.Columns 
     'could do a case statement here on document names which would be 
     'your table names 
     'then do if col equals your element, true 
    Next 
Next 
+0

Sieht aus wie es funktioniert. Ich überprüfe es jetzt – user2739418

+0

, wenn ich half, markieren Sie bitte als Antwort, wenn nicht sagen Sie mir, welche anderen Ausgaben Sie haben, und ich kann versuchen, mehr zu helfen. Danke – Mark10687

+0

Tx für die Frage Mark. Bin in anderen Sachen beschäftigt. Hoffentlich werde ich es heute Abend oder morgen früh testen. – user2739418

0

benutzte ich C# programming language und System.Xml.Linq Bibliothek für Ihre qustion wie folgt: ich ValidateColumn metod so schrieb:

bool ValidateColumn(string rootTypeName, string fieldName) 
{ 
    bool contains = false; 
    var xDoc = XDocument.Load(yourXsdFilePath); 
    foreach (var typeElement in xDoc.Root.Elements()) 
    { 
     foreach (var field in typeElement.Elements().FirstOrDefault().Elements()) 
     { 
      // checks if parent type element name equals give name, and child field element name equals given fieldName 
      // and check this validation if your rootTypeName begins with 'Type_' 

      int indexOfTypePrefix = typeElement.FirstAttribute.Value.IndexOf("Type_"); 
      if ((typeElement.FirstAttribute.Value == rootTypeName && field.FirstAttribute.Value == fieldName) 
        || 
       (indexOfTypePrefix == 0 && typeElement.FirstAttribute.Value.Substring(indexOfTypePrefix + 5) == rootTypeName 
        && field.FirstAttribute.Value == fieldName) 
       ) 
      { 
       contains = true; 
       break; 
      } 
     } 
     if (contains) 
      break; 
    } 
    return contains; 
} 

und ich habe es in einem console application getestet, es gibt Antworten wie Sie wollen.

Console.WriteLine("Function Validatetion for {0}, {1}: {2}", "Type_Document1", "State", ValidateColumn("Type_Document1", "State")); 
// prints: Function Validatetion for Type_Document1, State: True 
Console.WriteLine("Function Validatetion for {0}, {1}: {2}", "Document1", "State", ValidateColumn("Document1", "State")); 
// prints: Function Validatetion for Document1, State: True 
Console.WriteLine(); 
Console.WriteLine("Function Validatetion for {0}, {1}: {2}", "Type_Document2", "Designation", ValidateColumn("Type_Document2", "Designation")); 
// prints: Function Validatetion for Type_Document2, Designation: False 
Console.WriteLine("Function Validatetion for {0}, {1}: {2}", "Document2", "Title", ValidateColumn("Document2", "Title")); 
// prints: Function Validatetion for Document2, Title: False 

ps. Ich habe die FirstAttribute-Eigenschaft verwendet, um den Eigenschaftsnamen zu erhalten. Daher muss Ihr Namensattribut zuerst in Ihrem Knoten für diesen Code geschrieben werden. Und Sie können diesen Code optimieren.

Verwandte Themen