2014-12-03 2 views
2

Я читал несколько руководств о том, как использовать 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.

+0

Это звонит, сообщите нам, если это проливает свет на проблему, потому что DataSet не нужен, если вы следуете моим инструкциям здесь: http://stackoverflow.com/a/12233006/495455 –

ответ

0

Наконец-то я получил его на работу! Если кто-то снова сталкивается с этой проблемой, это очень просто. Я создал два моих файла, используя:

xsd room.xml 
xsd room.xsd /classes 

Он создал комнату.xsd и комнату.cs. Когда я добавил их в свой проект, как я уже говорил, он был взорван 4 файлами, один из которых вызывал проблемы.

Проблема заключается в номере.Designer файла. Он указывает, что помещение наследуется от DataSet, и оба комнаты.Designer и room.cs помечены как частичный класс. Я удалил cs.Designer и удалил частичный префикс и заставил его работать. Я думаю, что это проблема с конструктором, встроенным в Visual Studio, и его можно сделать менее грубым с правильными настройками, но это тоже оказалось замечательным.

Смежные вопросы