在c#中访问XSD文件的元素

我已经搜索了S / O但没有找到任何解决我的问题的东西(虽然C# – 解析XSD架构 – 让所有元素到了combobox都有所帮助)。
在下面的XSD文件中,我需要获取嵌套元素的名称(SectionA然后到AX010_1,AX040_1 ..然后到SectionB和BX010_1,BX070_1等)

如何访问嵌套元素?

                                                             

阅读XSD文件时,需要考虑两件事:

  • 获取命名空间(使用XElement.GetDefaultNamespace )
  • 取前缀(使用XElement.GetNamespaceOfPrefix )

您需要在XSD文件中手动找到自己的方式

  • 找到complexType节点
  • 找到序列
  • 找到元素
  • 等等

这并不难,但很乏味。 如果您经常需要这个,那么您可以将方法实现为扩展。 可以针对error handling优化随后的代码。

使用LINQ2XML的可能解决方案如下所示:

 try { var xsd = XDocument.Load("d:\\temp\\input.xsd"); var ns = xsd.Root.GetDefaultNamespace(); var prefix = xsd.Root.GetNamespaceOfPrefix("xs"); // get Vehicle var vehicle = xsd.Root.Element(prefix + "element"); // get sequence for Ford var sections = vehicle.Element(prefix + "complexType") .Element(prefix + "sequence") // the Ford element .Element(prefix + "element") .Element(prefix + "complexType") .Element(prefix + "sequence") // elements .Elements(prefix + "element").ToList(); foreach (var section in sections) { Console.WriteLine(section.Attribute("name").Value); // for each section element var items = section.Element(prefix + "complexType") .Element(prefix + "sequence") // take the test elements .Elements(prefix + "element"); foreach (var item in items) { Console.WriteLine(item.Attribute("name").Value); // access another attributes or values here } } } catch (Exception exception) { Console.WriteLine(exception.Message); } 

输出是:

 SectionA AX010_1 AX040_1 AX050_1 AX190_1 A080_1 AX230F_1 AX230G_1 AX230GNOTE_1 AX230H_1 AX230HNOTE_1 AX230J_1 SectionB BX010_1 BX070_1 ... 

xsd只不过是带有命名空间的xml

 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(@"C:\myXsd.xsd"); XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable); nsmgr.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema"); XmlNodeList nodes = xmlDoc.SelectNodes("//xs:element[starts-with(@name, 'Section')]/*//xs:element", nsmgr); List namesList = new List(); foreach (XmlNode node in nodes) { namesList.Add(node.Attributes["name"].Value); } 

应该产生所需的输出。