我正在学习如何使用xsd.exe反序列化XML的一些教程。我有两个生成的文件,一切似乎工作正常。
但后来我注意到我无法访问itemsField,就像在我的例子中一样,是room.Items [0]。
经过一些搜索,结果发现它正在反序列化为DataSet,我必须使用computers.element.Rows进行迭代。我不想这样做,我也不知道为什么我得到了DataSet选项。在我的XSD中,我确实有msdata:IsDataSet =" true"选项,但将其更改为false或/并使用/ classes开关生成xsd room.xsd并不起作用。
我在这里可以缺少什么?
旁注:当我同时将room.cs和room.xsd同时引用到我的项目时,它被炸成4个不同的文件并正确构建。当我的构建有错误时,我确实得到来自Room.xml的Message 1 Could not find schema information for the element 'room'.
但是当我遍历这个我不想要的DataSet时,我正确地得到了所有节点。
除了room.cs之外的任何东西都是很多我不太了解的自动化垃圾(比如很长很糟糕的room.Designer类),所以这是我的room.cs:
using System.Xml.Serialization;
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class room {
private roomDevice[] itemsField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("device", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public roomDevice[] Items {
get {
return this.itemsField;
}
set {
this.itemsField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class roomDevice {
private string xcoordField;
private string ycoordField;
private string macaddressField;
private string typeField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string xcoord {
get {
return this.xcoordField;
}
set {
this.xcoordField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string ycoord {
get {
return this.ycoordField;
}
set {
this.ycoordField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string macaddress {
get {
return this.macaddressField;
}
set {
this.macaddressField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string type {
get {
return this.typeField;
}
set {
this.typeField = value;
}
}
}
使用xsd room.xml生成和XSD:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="room" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="room" msdata:IsDataSet="true" msdata:Locale="en-US">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="device">
<xs:complexType>
<xs:sequence>
<xs:element name="xcoord" type="xs:string" minOccurs="0" msdata:Ordinal="0" />
<xs:element name="ycoord" type="xs:string" minOccurs="0" msdata:Ordinal="1" />
<xs:element name="macaddress" type="xs:string" minOccurs="0" msdata:Ordinal="2" />
</xs:sequence>
<xs:attribute name="type" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
至于执行XmlSerializer的代码,它很简单:
public static room xmlHandler(StreamReader xmlFile)
{
var serializer = new XmlSerializer(typeof(room));
return (room)serializer.Deserialize(xmlFile);
}
如果还需要其他任何东西,我会发布它! 说实话,我不知道自己做错了什么。认为这将是非常容易的,现在我被卡住了。
感谢您的帮助!
TLDR:反序列化后,我的应用无法使用room.Items []而不是room.device.Rows。使用xsd.exe生成的文件。
答案 0 :(得分:0)
最后我开始工作了! 如果有人再遇到这个问题,那很简单。我使用:
生成了我的两个文件xsd room.xml
xsd room.xsd /classes
它生成了room.xsd和room.cs.当我将它们添加到我的项目中时,正如我之前所说的,它被炸成4个文件,其中一个导致了问题。
问题是room.Designer文件。它指定房间继承自DataSet,并且room.Designer和room.cs都标记为部分类。我删除了cs.Designer并删除了部分前缀并使其工作。我想这是Visual Studio中内置的设计器的一个问题,并且通过正确的设置可以减少粗糙度,但这也很棒。