Pregunta

Estoy trabajando con un archivo XML que contiene grandes colecciones ilimitadas. La idea es utilizar XmlReader para leer el archivo y deserializar el XML interior en un objeto y hacer su posterior procesamiento.

La estructura XML es algo como esto:

<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>

Todo va bien con envoltura alrededor XMLReader XMLTextReader para leer el archivo. Sin embargo, cuando traté de deserializar manzana individuo en un objeto que lanza InvaildOperationException.

Cualquier persona sabe cuál es el problema? ¿Hay una mejor manera de hacerlo?

Aquí están los fragmentos de código

//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
¿Fue útil?

Solución

XML deserializar necesidad primera línea ser

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

Si desea convertir una parte del documento XML a objeto que tendrá que añadir esta línea en la parte superior del XML parcial.

Además lo necesario para decorar la clase Apple con XmlRootAttribute donde ElementName será 'Apple'

este artículo describe cómo configurar XmlRootAtrribute http://msdn.microsoft.com/en-us /library/system.xml.serialization.xmlrootattribute.aspx

Esperamos que esto ayude

Reagards.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top