2010-04-11 109 views
0

我試圖瞭解一點點XSD和我試圖創建此XML格式的XSD:遞歸XSD幫助

<Document> 
    <TextBox Name="Username" /> 
    <TextBox Name="Password" /> 
</Document> 

...所以有一個元素,它是一個抽象的複雜類型。每個元素都有元素等等。 DocumentTextBox正在延伸Element

我TRID這樣的:

<?xml version="1.0" encoding="utf-8" ?> 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Document"> 
    <xs:complexType> 
     <xs:complexContent> 
     <xs:extension base="Element"> 

     </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="Element" abstract="true"> 
    <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
     <xs:element name="Element" type="Element"></xs:element> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="TextBox"> 
    <xs:complexContent> 
     <xs:extension base="Element"> 
     <xs:attribute name="Name" type="xs:string" /> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

我把它編譯成C#與Xsd2Code,現在我嘗試反序列化:

var serializer = new XmlSerializer(typeof(Document)); 

var document = (Document)serializer.Deserialize(new FileStream("Document1.xml", FileMode.Open)); 

foreach (var element in document.Element1) 
{ 
    Console.WriteLine(((TextBox)element).Name); 
} 

Console.ReadLine(); 

,它這麼想的打印任何東西。當我嘗試序列化,像這樣:

var serializer = new XmlSerializer(typeof(Document)); 

var document = new Document(); 

document.Element1 = new List<Element>(); 

document.Element1.Add(new TextBox() 
{ 
    Name = "abc" 
}); 

serializer.Serialize(new FileStream("d.xml", FileMode.Create), document); 

...輸出爲:

<?xml version="1.0"?> 
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Element1> 
    <Element xsi:type="TextBox"> 
     <Element1 /> 
     <Name>abc</Name> 
    </Element> 
    </Element1> 
</Document> 

當它應該是這樣的:

<?xml version="1.0"?> 
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <TextBox Name="abc" /> 
</Document> 

任何想法如何解決xsd或其他代碼生成器?

謝謝。

回答

0

在XSD代碼中,查看聲明名爲「Element」元素的行。如果您要在XML文件中使用<TextBox/>,則應將此元素命名爲<xs:element name="TextBox" />

通過執行上述更改,您可以運行xsd.exe /c YourFile.xsd以從XSD生成C#類。包括C#項目生成的文件,你就可以使用它像這樣:

Document d = new Document(); 
    d.TextBox = new TextBox[] 
    { 
    new TextBox() { Name = "Username" }, 
    new TextBox() { Name = "Password" }, 
    }; 
    XmlSerializer ser = new XmlSerializer(typeof(Document));    
    ser.Serialize(Console.Out, d);

你也可以反序列化XML回C#的對象。

<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <TextBox xsi:type="TextBox" Name="Username" /> 
    <TextBox xsi:type="TextBox" Name="Password" /> 
</Document>

xsi:type屬性 - 因爲你宣佈你TextBox元素爲類型Element你將不得不提供反序列化這些元素之一時所使用的具體類型的實現。出於好奇,我嘗試將名爲TextBox的元素的XSD類型更改爲TextBox類型,但xsd.exe拋出了StackOverflowException。我笑了起來。這可能與Element和TextBox之間的遞歸類型關係有關,但是也許不同的工具會以不同的方式處理它?