2011-10-29 4 views
2

Каков наилучший способ генерации классов из сложного XML для десериализации в Silverlight? В .NET вы можете использовать xsd.exe из Visual Studio.Как сгенерировать классы с помощью инструмента XML для сериализации в Silverlight?

у получить что-то вроде этого

using System.Xml.Serialization; 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
// this is unknown in SILVERLIGHT [System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
//this is unknown in SILVERLIGHT [System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 

public partial class Attest { 

private AttestBet[] betField; 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute("Bet")] 
public AttestBet[] Bet { 
    get { 
     return this.betField; 
    } 
    set { 
     this.betField = value; 
    } 
} 
} 

но когда я копировать вставить в Silverlight приложения я получаю сообщение об ошибке для

// this is unknown in SILVERLIGHT [System.SerializableAttribute()] 
//this is unknown in SILVERLIGHT [System.ComponentModel.DesignerCategoryAttribute("code")] 

когда я комментировать его, и использовать код без этих 2-х линий это своего рода работали на простом примере. Есть ли лучший инструмент для создания классов для использования в Silverlight?

+0

любого, используя это ?? – Gero

+0

Я использовал xsd в проекте Silverlight. Я просто сделал быстрый поиск и заменил в сгенерированном коде, чтобы удалить все неподдерживаемые атрибуты. Это раздражает необходимость выполнять этот ручной шаг каждый раз, когда вы меняете схему, но она работает. – Phil

ответ

0

Вы правы, никто никто не делает этого проще, просто проанализируйте XML-файл. Но вы можете использовать приведенный ниже код, если скажете, что хотите связать управление напрямую с XML-файлом и хотите иметь хороший сериализовать/запрашивать. Обычно я использую этот метод только при работе с большими данными, которые обрабатываются с помощью WCF (что составляет 50-600 МБ за звонок).

Создайте новый класс с именем XmlNodeItem. Класс представляет собой отдельный узел из файла XML

public class XmlNodeItem 
{ 
    [XmlAttribute(AttributeName = "Bet")] 
    public string Bet 
    { 
     get; 
     set; 
    } 
    [XmlAttribute(AttributeName = "SomeOtherStuff")] 
    public string SomeOtherStuff 
    { 
     get; 
     set; 
    } 
} 

Затем создать еще один класс с именем XmlNodeItemList, который вытекает из ObservableCollection из XmlNodeItem.

[XmlRoot(ElementName = "Items")] 
public class XmlNodeItemList : ObservableCollection<XmlNodeItem> 
{ 
    public void AddRange(IEnumerable<XmlNodeItem> range) 
    { 
     foreach (XmlNodeItem node in range) 
     { 
      this.Add(node); 
     } 
    } 
} 

Затем получить данные

public DataClass: XmlNodeItemList 
{ 

var data = AddRange(RetrieveData(File.Open(value, FileMode.Open))); 


//Retrieve Data method 

public XmlNodeItemList RetrieveData(Stream xmlStream) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(XmlNodeItemList)); 
     StreamReader reader = new StreamReader(xmlStream); 
     XmlNodeItemList list = (XmlNodeItemList)serializer.Deserialize(reader); 
     return list; 
    } 
} 

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

  • Нет связанных вопросов^_^