【问题标题】:accessing the elements of an XSD file in c#在 C# 中访问 XSD 文件的元素
【发布时间】:2021-12-10 23:16:34
【问题描述】:

我已经搜索了 S/O,但没有找到任何可以解决我的问题的方法(尽管 C# - Parsing XSD schema - get all elements to combobox 帮助了一点)。
在下面的 XSD 文件中,我需要获取嵌套元素的名称(SectionA 然后到 AX010_1、AX040_1.. 然后到 SectionB 和 BX010_1、BX070_1 等)

如何访问嵌套元素?

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="Vehicle">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Ford" minOccurs="0" maxOccurs="1">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="SectionA" minOccurs="0" maxOccurs="1">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="AX010_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="AX040_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="AX050_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="AX190_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="A080_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="AX230F_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="AX230G_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="AX230GNOTE_1" type="ExplanatoryText" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="AX230H_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="AX230HNOTE_1" type="ExplanatoryText" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="AX230J_1" type="ExplanatoryText" minOccurs="0" maxOccurs="1"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="SectionB" minOccurs="0" maxOccurs="1">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="BX010_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="BX070_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="BX350N_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="BX350NNOTE_1" type="ExplanatoryText" minOccurs="0" maxOccurs="1"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="SectionC" minOccurs="0" maxOccurs="1">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="C010_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="C010_2" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="C010_4" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="CF030_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="SectionD" minOccurs="0" maxOccurs="1">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="D010_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="D030_2" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                        <xs:element name="D560_1" type="Dollar" minOccurs="0" maxOccurs="1"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

【问题讨论】:

  • 到目前为止你的代码是什么?递归搜索怎么样?对于文档中的每个 XElement,递归搜索所有子元素,直到找到属性名称为 SectionA 的子元素?

标签: c# xml xsd


【解决方案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<string> namesList = new List<string>();

foreach (XmlNode node in nodes)
{
    namesList.Add(node.Attributes["name"].Value);
}

应该产生所需的输出。

【讨论】:

    【解决方案2】:

    读取 XSD 文件时,有两点需要考虑:

    您需要在 XSD 文件中手动查找

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

    这并不难,但很乏味。如果您经常需要它,那么您可以将这些方法实现为扩展。下面的代码可以针对错误处理进行优化。

    使用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
    ...
    

    【讨论】:

      猜你喜欢
      • 2022-09-24
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      相关资源
      最近更新 更多