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);
            }
        }

这是输出

安迪 ----- E1 安迪 ----- E2 安迪 ----- E3 安迪 ----- E4 安迪 ----- E5

我希望它在哪里输出

安迪 ----- E1 安迪 ----- E2 安迪 ----- E3 安迪 ----- E4 安迪 ----- E5 A1 A2 A3

提前致谢。

4

2 回答 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);
    }
}
于 2012-04-12T18:13:00.717 回答
1

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

xsd MySchema.xsd /CLASSES

/CLASSES 开关用于 xsd 包含多个类的情况。

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

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

于 2012-04-12T18:12:51.317 回答