C# 递归XSD帮助
我正在尝试学习一点XSD,并尝试为此xml创建一个XSD:C# 递归XSD帮助,c#,xml,xsd,xml-serialization,xsd2code,C#,Xml,Xsd,Xml Serialization,Xsd2code,我正在尝试学习一点XSD,并尝试为此xml创建一个XSD: <Document> <TextBox Name="Username" /> <TextBox Name="Password" /> </Document> 我使用XSD2代码将其编译为C,现在我尝试对其进行反序列化: var serializer = new XmlSerializer(typeof(Document)); var document = (Document)s
<Document>
<TextBox Name="Username" />
<TextBox Name="Password" />
</Document>
我使用XSD2代码将其编译为C,现在我尝试对其进行反序列化:
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或其他代码生成器
谢谢。在XSD代码中,请查看声明名为element的元素的行。如果要在XML文件中使用,则应将此元素命名为 实现上述更改后,可以运行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。我笑了。这可能与元素和TextBox之间的递归类型关系有关,但可能不同的工具会以不同的方式处理它
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TextBox xsi:type="TextBox" Name="Username" />
<TextBox xsi:type="TextBox" Name="Password" />
</Document>