如何使用 C# 在简单的 xsd 元素中查找限制值

2024-01-10

如何使用 c# 在 xsd simpleType 上检索这些枚举类型?这是一个简单类型的示例?

<xs:simpleType name="PaymentType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Cash" />
      <xs:enumeration value="CreditCard" />
  </xs:restriction>
</xs:simpleType>

谢谢


您可以使用架构对象模型 (SOM),如以下代码所示:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml;
using System.Xml.Schema;

namespace Testing.Xml
{
    class Program
    {
        static void Main(string[] args)
        {
            // read the schema
            XmlSchema schema;
            using (var reader = new StreamReader(@"c:\path\to\schema.xsd"))
            {
                schema = XmlSchema.Read(reader, null);
            }

            // compile so that post-compilation information is available
            XmlSchemaSet schemaSet = new XmlSchemaSet();
            schemaSet.Add(schema);
            schemaSet.Compile();

            // update schema reference
            schema = schemaSet.Schemas().Cast<XmlSchema>().First();

            var simpleTypes = schema.SchemaTypes.Values.OfType<XmlSchemaSimpleType>()
                                               .Where(t => t.Content is XmlSchemaSimpleTypeRestriction);

            foreach (var simpleType in simpleTypes)
            {
                var restriction = (XmlSchemaSimpleTypeRestriction) simpleType.Content;
                var enumFacets = restriction.Facets.OfType<XmlSchemaEnumerationFacet>();

                if (enumFacets.Any())
                {
                    Console.WriteLine("" + simpleType.Name);
                    foreach (var facet in enumFacets)
                    {
                        Console.WriteLine(facet.Value);
                    }
                }
            }
        }
    }
}

不过,此代码仅适用于命名的简单类型 - 如果您有包含匿名简单类型的元素或属性,那么它会变得更加复杂,因为您必须遍历所有元素和属性才能找到具有枚举方面的限制内容的简单类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 C# 在简单的 xsd 元素中查找限制值 的相关文章

随机推荐