使用xsd.exe反序列化 - 如何反序列化为对象,而不是反向数据集?

时间:2014-12-03 13:42:31

标签: c# xml serialization xsd deserialization

我正在学习如何使用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生成的文件。

1 个答案:

答案 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中内置的设计器的一个问题,并且通过正确的设置可以减少粗糙度,但这也很棒。