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

C# 在c中访问XSD文件的元素#,c#,xml,xsd,C#,Xml,Xsd,我已搜索了S/O,但没有找到任何解决我的问题的方法(尽管有一点帮助)。 在下面的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" elementFormDefaul

我已搜索了S/O,但没有找到任何解决我的问题的方法(尽管有一点帮助)。
在下面的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>

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);
}
XmlDocument xmlDoc=new XmlDocument();
Load(@“C:\myXsd.xsd”);
XmlNamespaceManager nsmgr=新的XmlNamespaceManager(xmlDoc.NameTable);
nsmgr.AddNamespace(“xs”http://www.w3.org/2001/XMLSchema");
XmlNodeList节点=
SelectNodes(//xs:element[以(@name,'Section')开头]/*///xs:element”,nsmgr);
列表名称列表=新列表();
foreach(节点中的XmlNode节点)
{
namesList.Add(node.Attributes[“name”].Value);
}

应该会产生所需的输出。

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);
}
XmlDocument xmlDoc=new XmlDocument();
Load(@“C:\myXsd.xsd”);
XmlNamespaceManager nsmgr=新的XmlNamespaceManager(xmlDoc.NameTable);
nsmgr.AddNamespace(“xs”http://www.w3.org/2001/XMLSchema");
XmlNodeList节点=
SelectNodes(//xs:element[以(@name,'Section')开头]/*///xs:element”,nsmgr);
列表名称列表=新列表();
foreach(节点中的XmlNode节点)
{
namesList.Add(node.Attributes[“name”].Value);
}

应产生所需的输出。

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

  • 获取名称空间(使用)
  • 使用前缀(使用)
您需要在XSD文件中手动查找路径:

  • 查找complexType节点
  • 找到序列
  • 找到元素
  • 等等
这并不难,但很乏味。如果您经常需要,那么您可以将这些方法实现为扩展。下面的代码可以针对错误处理进行优化

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

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文件时,需要考虑两件事:

  • 获取名称空间(使用)
  • 使用前缀(使用)
您需要在XSD文件中手动查找路径:

  • 查找complexType节点
  • 找到序列
  • 找到元素
  • 等等
这并不难,但很乏味。如果您经常需要,那么您可以将这些方法实现为扩展。下面的代码可以针对错误处理进行优化

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

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

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