猿问

如何在 XSD 中获取 simpleType 的最大长度/模式值

我想遍历一个 xsd 以获取每个属性的类型,然后获取该类型的值,但我只停留在检索类型上。


至此我已经通过递归成功遍历了xsd树


private int GetFieldMaxLengthValue(XmlSchemaObject element)

        {

            if(element is XmlSchemaComplexType)

            {

                var complextType = element as XmlSchemaComplexType;


                if(complextType.Particle == null)

                {

                    var attributes = complextType.Attributes;


                    foreach (var attribute in attributes)

                    {

                        var schemaAttribute = attribute as XmlSchemaAttribute;

                        var attributeSchemaType = schemaAttribute.SchemaTypeName.Name;



                    }

                }

                else

                {

                    GetFieldMaxLengthValue(complextType.Particle);

                }

            }

            else if(element is XmlSchemaSequence)

            {

                var sequence = element as XmlSchemaSequence;


                foreach (XmlSchemaObject item in sequence.Items)

                {

                    var schemaType = item as XmlSchemaElement;

                    GetFieldMaxLengthValue(schemaType.SchemaType);

                }

            }

            return 0;

        }

这是我要检索的 simpleType 的值 (maxLength):


 <xs:simpleType name="String100">

    <xs:restriction base="xs:string">

      <xs:maxLength value="100" />

    </xs:restriction>

  </xs:simpleType>

我需要获取值 100 并将其保存在一个变量中供以后使用。


在我提供的代码片段中,查看第一个 foreach 循环。一旦我们到达一个没有其他孩子作为 complexTypes 的 complexType,我们就到了那里。所以我们已经到达了最后一个 complexType 及其唯一的孩子 xs:attributes。现在,当我转换属性时,我可以检索名称和类型。但我需要的是从代码段最后提供的约束中收集类型的值。


PS我知道我可以采用类型的名称“string100”并将其子字符串化以获得 100 并将其解析为 int,但如果不是这种情况怎么办?


蓝山帝景
浏览 136回答 2
2回答

不负相思意

我使用了不同的大模式,并使用 xml linq 递归地将 xsd 解析为树结构。请参阅下面的解决方案using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;using System.Xml.Linq;namespace ParseSchema{&nbsp; &nbsp; class Program&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; const string FILENAME = @"c:\temp\test.xsd";&nbsp; &nbsp; &nbsp; &nbsp; static void Main(string[] args)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XDocument doc = XDocument.Load(FILENAME);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XElement root = doc.Root;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XNamespace ns = root.GetNamespaceOfPrefix("xs");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Element element = new Element(null, root, ns, null);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SimpleContent.LinkParents();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Element.LinkParents();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; public class Element&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; public static List<Element> elements = new List<Element>();&nbsp; // needed to link to parent&nbsp; &nbsp; &nbsp; &nbsp; public XNamespace ns { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; SchemaType schemaType { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public Dictionary<string, object> typeDictionary = null;&nbsp; &nbsp; &nbsp; &nbsp; public Dictionary<string, string> attributeDictionary = null;&nbsp; &nbsp; &nbsp; &nbsp; public Element parent { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public string annotation { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public Element(SchemaType parentSchema, XElement parentXElement, XNamespace ns, Element parentElement)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XElement xAnnotation;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XElement xElement;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.parent = parentElement;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.ns = ns;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Element.elements.Add(this);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<XElement> xTypes = parentXElement.Elements().Where(x => (x.Name.LocalName == "simpleType") | (x.Name.LocalName == "complexType")).ToList();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (XElement xType in xTypes)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string name = (string)xType.Attribute("name");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (typeDictionary == null) typeDictionary = new Dictionary<string, object>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SchemaType newType = new SchemaType(xType, ns, this);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; typeDictionary.Add(name, newType);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xElement = parentXElement.Element(ns + "element");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; attributeDictionary = xElement.Attributes()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .GroupBy(x => x.Name.LocalName, y => (string)y)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .ToDictionary(x => x.Key, y => y.FirstOrDefault());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xAnnotation = xElement.Element(ns + "annotation");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (annotation != null) annotation = (string)xAnnotation.Element(ns + "documentation");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public static void LinkParents()&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (Element element in elements)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string stringType = "";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Boolean foundAttributeType = element.attributeDictionary.TryGetValue("type", out stringType);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (foundAttributeType && !stringType.StartsWith("xs:"))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Element parent = element;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; object obj = null;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (parent != null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (parent.typeDictionary != null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Boolean foundType = parent.typeDictionary.TryGetValue(stringType, out obj);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (foundType)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.schemaType = (SchemaType)obj;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parent = parent.parent;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; public class SchemaType&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; public string name { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public string simpleComplex { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public string annotation { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public List<Attribute> attributes { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public Restrictions restriction { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public SimpleContent simpleContent { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public Element parentElement { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public List<Element> elements { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public SchemaType(XElement schemaType, XNamespace ns, Element parentElement)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; simpleComplex = schemaType.Name.LocalName;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (XElement child in schemaType.Elements())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; switch (child.Name.LocalName)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case "annotation":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; annotation = (string)child.Element(ns + "documentation");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case "attribute":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Attribute newAttribute = new Attribute(child, ns, parentElement);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (attributes == null) attributes = new List<Attribute>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; attributes.Add(newAttribute);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case "restriction":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; restriction = new Restrictions(child, ns);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case "sequence":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elements = child.Elements(ns + "element").Select(x => new Element(this, child, ns, parentElement)).ToList();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case "simpleContent" :&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; simpleContent = new SimpleContent(child, ns, parentElement);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; public class Restrictions&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; string baseType { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; Dictionary<string, List<string>> enumerations { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public Restrictions(XElement xRestriction, XNamespace ns)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; baseType = (string)xRestriction.Attribute("base");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; enumerations = xRestriction.Elements()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .GroupBy(x => x.Name.LocalName, y => (string)y.Attribute("value"))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .ToDictionary(x => x.Key, y => y.ToList());&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; public class Attribute&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; public Dictionary<string, string> attributeDictionary;&nbsp; &nbsp; &nbsp; &nbsp; public string annotation { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public SchemaType schemaType { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public Attribute(XElement attribute, XNamespace ns, Element parentElement)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; attributeDictionary = attribute.Attributes()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .GroupBy(x => x.Name.LocalName, y => (string)y)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .ToDictionary(x => x.Key, y => y.FirstOrDefault());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XElement xAnnotation = attribute.Element(ns + "annotation");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (annotation != null) annotation = (string)xAnnotation.Element(ns + "documentation");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<XElement> xSchemaType = attribute.Elements().Where(x => (x.Name.LocalName == "simpleType") | (x.Name.LocalName == "complexType")).ToList();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(xSchemaType.Count > 0) schemaType = new SchemaType(xSchemaType.FirstOrDefault(), ns, parentElement);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; public class SimpleContent&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; public static List<SimpleContent> contents = new List<SimpleContent>();&nbsp; // needed to link to parent&nbsp; &nbsp; &nbsp; &nbsp; public string baseType { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public List<Attribute> attributes { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public SchemaType schemaType { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public Element parentElement { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; public SimpleContent(XElement content, XNamespace ns, Element parentElement)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.parentElement = parentElement;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; contents.Add(this);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XElement extension = content.Element(ns + "extension");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (extension != null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; baseType = (string)extension.Attribute("base");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<XElement> xAttributes = extension.Elements(ns + "attribute").ToList();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (XElement xAttribute in xAttributes)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (attributes == null) attributes = new List<Attribute>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Attribute newAttribute = new Attribute(xAttribute, ns, parentElement);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; attributes.Add(newAttribute);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public static void LinkParents()&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (SimpleContent content in contents)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!content.baseType.StartsWith("xs:"))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Element parent = content.parentElement;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; object obj = null;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (parent != null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Boolean foundType = parent.typeDictionary.TryGetValue(content.baseType, out obj);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (foundType)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; content.schemaType = (SchemaType)obj;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parent = parent.parent;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}

侃侃尔雅

这一直可用,看起来很简单:using (XmlReader schemaReader = XmlReader.Create(new StringReader(the_schema_as_string)))&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XmlSchemaSet schemaSet = new XmlSchemaSet();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; schemaSet.Add(XmlSchema.Read(schemaReader, null));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var xsdAsXDoc = XDocument.Load(new StringReader(the_schema_as_string));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var ns = XNamespace.Get(@"http://www.w3.org/2001/XMLSchema");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (XmlSchemaElement element in schemaSet.Schemas()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Cast<XmlSchema>()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .SelectMany(s => s.Elements.Values.Cast<XmlSchemaElement>()))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GetFieldMaxLengthValue(element, xsdAsXDoc, ns);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }您从 foreach 检索的元素有一个属性“父级”,当您从那里单击父级时,您可以找到所有类型。在我直接停留在根元素之前,我一直应该去父元素并从那里搜索简单类型!
随时随地看视频慕课网APP
我要回答