Десериализовать InnerXML в объект в .NET - PullRequest
1 голос
/ 08 ноября 2010

Я работаю с большим XML-файлом, содержащим неограниченные коллекции. Идея состоит в том, чтобы использовать XmlReader для чтения файла и десериализации внутреннего xml в объект и выполнения дальнейшей обработки.

Структура XML выглядит примерно так:

<Basket xmlns="http://AppleFarm.com/Basket">
 <AppleCount>10000</AppleCount>
 <Apples>
  <Apple><ID>1</ID><Color>Red</Color></Apple>
  <Apple><ID>2</ID><Color>Green</Color></Apple>
  ...
  <Apple><ID>10000</ID><Color>Green</Color></Apple>
 </Apples>
</Basket>

Все идет хорошо, используя XMLReader, оборачивающий XMLTextReader для чтения файла. Однако, когда я пытался десериализовать отдельное яблоко в объект, он генерировал исключение InvaildOperationException.

Кто-нибудь знает, в чем проблема? Есть ли лучший способ сделать это?

Вот фрагменты кода

//Deserialize code
public object Deserialize(XmlDocument doc, Type type){
    using(XmlNodeReader reader - new XmlNodeReader(doc.DocumentElement)){
        XmlReaderSetting settings = new XmlReaderSettings();
        settings.ValidationType = ValidationType.None;
        using(XmlReader xReader = XmlReader.Create(reader, settings)){
            XmlSerializer serializer = new XmlSerializer(type);
            object obj = serializer.Deserialize(xReader);
        }
    }
}

public void GetApples(string filepath){
    XmlTextReader reader = new XmlTextReader(filepath);
    while(reader.Read()){
        while(reader.NoteType == XmlNodeType.Element &&
            reader.Name == "Apple"){
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(reader.ReadOuterXml());
            Apple a = (Apple)Deserialize(doc, typeof(Apple));

            //...
        }
    }
}
//Deserialize code end

//Apple class
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.XmlSerialization.XmlTypeAttribute(Namespace="http://AppleFarm.com/Basket")]
public partial class Apple{
    private string idField;
    private string colorField;

    public string Id{
        get{ return this.idField; }
        set{ this.idField = value; }
    }

    public string Color{
        get { return this.colorField; }
        set { this.colorField = value; }
    }
}
//Apple class end

1 Ответ

1 голос
/ 09 ноября 2010

Для десериализации XML необходимо, чтобы первая строка была

<?xml version="1.0" encoding="utf-8"?>

Если вы хотите преобразовать часть XML-документа в Object, вам нужно будет добавить эту строку поверх частичного XML.

Кроме того, вам нужно украсить класс Apple с помощью XmlRootAttribute, где ElementName будет «Apple»

В этой статье описывается, как установить XmlRootAtrribute http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute.aspx

Надеюсь, это поможет

Reagards.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...