使用XDocument解析XSD

4
我很费劲地尝试解析一个模式文件,希望有人能够帮忙。
以下是xsd文件的样子。
 <xs:element name="E1">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="E2" nillable="true" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="E3" minOccurs="0" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="E4" nillable="true" minOccurs="0">
                                        <xs:complexType>
                                            <xs:sequence>
                                                <xs:element name="E5" minOccurs="0" maxOccurs="unbounded">
                                                    <xs:complexType>
                                                        <xs:attribute name="A1" type="xs:integer" use="optional" />
                                                        <xs:attribute name="A2" type="xs:string" use="optional" />
                                                        <xs:attribute name="A3" type="xs:string" use="optional" />\
                                                    </xs:complexType>
                                                </xs:element>
                                            </xs:sequence>
                                        </xs:complexType>
                                    </xs:element>
                               </xs:complexType>
                            </xs:element>
                         </xs:complexType>
                     </xs:element>

这并不完整,但足以理解。以下是我尝试获取元素名称的代码,接着是任何属性(如果存在),但是这只返回元素名称。

var xs = XNamespace.Get("http://www.w3.org/2001/XMLSchema");
var doc = XDocument.Load(sourceName + sourceApi + "Input.txt");
        foreach (var el in doc.Descendants(xs + "element"))
        {
            Trace.WriteLine("ANDY ------ " + el.Attribute("name").Value);
            foreach (var attr in el.Elements(xs + "attribute"))
            {
                Trace.WriteLine(attr.Attribute("name").Value);
            }
        }

这是输出

Andy ----- E1 Andy ----- E2 Andy ----- E3 Andy ----- E4 Andy ----- E5

我希望它输出到这里

Andy ----- E1 Andy ----- E2 Andy ----- E3 Andy ----- E4 Andy ----- E5 A1 A2 A3

谢谢您的帮助。

2个回答

4

el.Elements只检查子元素,所以它没有返回值。你应该使用Descendants或通过el.Elements(xs + "complexType").Elements(xs + "attribute")指定完整路径:

var xs = XNamespace.Get("http://www.w3.org/2001/XMLSchema");
var doc = XDocument.Load(sourceName + sourceApi + "Input.txt");
foreach (var el in doc.Descendants(xs + "element"))
{
    Trace.WriteLine("ANDY ------ " + el.Attribute("name").Value);
    foreach (var attr in el.Elements(xs + "complexType").Elements(xs + "attribute"))
    {
        Trace.WriteLine(attr.Attribute("name").Value);
    }
}

1

我发现使用Visual Studio XSD命令行工具是反序列化模式最简单的方法。在Visual Studio命令提示符中,您可以输入以下内容:

xsd MySchema.xsd /CLASSES

如果xsd包含多个类,则使用/CLASSES开关。

在这种情况下,输出将是一个名为"MySchema.cs"的文件。它将包含一个XmlSerializer类,可以完成XSD的工作。

(请注意,.xsd文件本身可以通过使用输入为.xml文件的名称调用相同的实用程序来生成。)


我不想用类....我正试图生成一个包括所有元素名称及其子属性的脚本。 - AndySousa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接