Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 递归XSD帮助_C#_Xml_Xsd_Xml Serialization_Xsd2code - Fatal编程技术网

C# 递归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

我正在尝试学习一点XSD,并尝试为此xml创建一个XSD:

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