2016-11-01 52 views
1

我想驗證或查找XSD文件中是否存在元素。在XSD中查找/驗證元素

我的XSD架構看起來如下:

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

現在在C#或vb.net我需要的,如果特定字段XSD架構存在驗證。

例如如果我通過以下參數的函數應該返回true

  • ValidateColumn( 「Type_Document1」, 「國家」)
  • ValidateColumn( 「文檔1」, 「國家」)

//應該使用像,以配合Type_Document1如果我們通過文檔1

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

但如果通以下,那麼它應該返回false,因爲這些因素不存在。

  • ValidateColumn( 「Type_Document2」, 「說明」)
  • ValidateColumn( 「文檔2」, 「標題」)

回答

0

下面是一些VB.NET代碼,可以讓你去:

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

看起來像它會工作。我現在檢查它 – user2739418

+0

如果我幫助請標記爲答案,如果不告訴我你還有什麼其他問題,我可以嘗試幫助更多。謝謝 – Mark10687

+0

Tx請求馬克。忙於其他的東西。希望今晚或明天早上進行測試。 – user2739418

0

我使用了C# programming languageSystem.Xml.Linq庫,如下所示: 我寫了ValidateColumn metod那樣:

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; 
} 

我在console application中測試過它,它給出了你想要的答案。

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。我使用FirstAttribute屬性獲取屬性名稱,因此您的名稱屬性必須首先寫入節點中,以用於此代碼。你可以優化這段代碼。