Я читал несколько руководств о том, как использовать xsd.exe для десериализации XML. У меня есть два сгенерированных файла, и все, казалось, работает нормально.Deserializing with xsd.exe - как десериализовать объекты, а не DataSet?
Но потом я заметил, что я не могу добраться до элементов Items, как это должно быть в моем примере, room.Items [0].
После небольшого поиска выяснилось, что он десериализуется в DataSet, и мне нужно перебирать с помощью computer.element.Rows. Я не хочу этого делать, и я не знаю, почему у меня есть опция DataSet. В моем XSD у меня есть msdata: IsDataSet = "true", но изменение его на false или/и генерация xsd room.xsd с ключом/classes не работает.
Что мне здесь не хватает? Сторона примечания. Когда я одновременно ссылался на оба комнаты room.cs и room.xsd на свой проект, он был взорван в 4 разных файла и построен правильно. Я получаю Message 1 Could not find schema information for the element 'room'.
, исходящий из Room.xml, когда у моей сборки есть ошибки, но когда я повторяю этот 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 генерироваться с XSD room.xml:
<?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.device.Rows после десериализации. Файлы, созданные с помощью xsd.exe.
Это звонит, сообщите нам, если это проливает свет на проблему, потому что DataSet не нужен, если вы следуете моим инструкциям здесь: http://stackoverflow.com/a/12233006/495455 –