【问题标题】:Find/Validate element in XSD在 XSD 中查找/验证元素
【发布时间】:2016-11-01 12:41:28
【问题描述】:

我想验证或查找 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","State")
  • ValidateColumn("Document1","State")

//如果我们通过了Document1,应该使用like来匹配Type_Document1

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

但是如果通过跟随那么它应该返回false,因为这些元素不存在。

  • ValidateColumn("Type_Document2 ","Designation")
  • ValidateColumn("Document2","Title")

【问题讨论】:

    标签: c# .net vb.net xsd xsd-validation


    【解决方案1】:

    这里有一些 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
    

    【讨论】:

    • 如果我帮助了,请标记为答案,如果没有,请告诉我您遇到的其他问题,我可以尝试提供更多帮助。谢谢
    • Tx 询问马克。忙于其他事情。希望今晚或明天早上进行测试。
    【解决方案2】:

    我使用C# programming languageSystem.Xml.Linq 库为您的qustion 如下: 我是这样写ValidateColumn方法的:

    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 属性来获取属性名称,因此您的名称属性必须首先在您的节点中写入此代码。你可以优化这段代码。

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多