¿Cómo extraer atributos de una matriz usando XmlSerializer?

Quiero extraer el atributo de imagen "href" usando XmlSerializer.

Funcionará si mi configuración se ve así:

<images>
       <image id="285">  
          http://images1.com/test.jpg" 
       </image>

       <image id="286">
          http://images1.com/test.jpg"
       </image>       
</images>

Pero no si se ve así:

<images>
    <image href=http://images1.com/test.jpg" id="285" />
    <image href=http://images1.com/test.jpg" id="286" />        
</images>

Aquí está mi objeto

   private string[] imageList;
   [XmlArrayItem("image", typeof(object))]
   [XmlArray("images")]

    public string[] imageLink
    {
        get
        {
            return imageList;
        }
        set
        {
            imageList = value;
        }

    }

preguntado el 27 de julio de 12 a las 21:07

¿Ha considerado usar Linq to Xml para esto en lugar de un serializador? -

@JamieSee Sí, estoy usando XBOX XDK, no creo que haya soporte para Linq en XBOX. -

@JamieSee, descubrí que esto también se puede lograr con XDocument. -

Sí puede, y en realidad es más fácil con XDcoument. No lo sugerí porque es parte de System.Xml.Linq. -

1 Respuestas

He intentado varias formas de intentar que un serializador se ajuste a este XML sin mucha suerte.

Es posible que desee hacer algo como esto:

    string xml = @"<images>
    <image href=""http://images1.com/test.jpg"" id=""285"" />
    <image href=""http://images1.com/test2.jpg"" id=""286"" />        
</images>";

    List<string> images = new List<string>();
    using (StringReader sr = new StringReader(xml))
    using (XmlTextReader xr = new XmlTextReader(sr))
    {
        while (!xr.EOF)
        {
            xr.MoveToContent();
            xr.ReadToDescendant("image");
            xr.MoveToAttribute("href");
            xr.ReadAttributeValue();            
            images.Add(xr.Value);
            xr.MoveToElement();
            if (xr.Name != "images")
            {
                xr.ReadElementString();
            }
            else
            {
                xr.ReadEndElement();
            }
        }
    }

He investigado un poco más y se me ocurrió una forma de usar la serialización y obtener el XML deseado:

[XmlRoot("images")]
public class ImageListWrapper
{
    public ImageListWrapper()
    {
        Images = new List<Image>(); 
    }

    [XmlElement("image")]
    public List<Image> Images
    {
        get; set;
    }

    public List<string> GetImageLocations()
    {
        List<string> imageLocations = new List<string>();

        foreach (Image image in Images)
        {
            imageLocations.Add(image.Href);
        }

        return imageLocations;
    }
}

[XmlRoot("image")]
public class Image
{
    [XmlAttribute("href")]
    public string Href { get; set; }
}

Respondido 30 Jul 12, 18:07

Sí, parece que tengo que refactorizar mi XML o usar este ingenioso código que proporcionaste. Muchas gracias, mientras tanto voy a ver si alguien puede venir con una solución de serializador XML. - fabii

Trabajé un poco más con él esta mañana y encontré una manera que funciona con la serialización con su XML exacto. - JamieVer

Se me ocurrió el mismo desglose, pero me perdí un par de pasos. Gracias amigo, eres un salvavidas. - fabii

Cuando deserializo, ¿lo estoy deserializando para escribir: ImageListWrapper? - fabii

Si eso es correcto. ImageListWrapper.Images contiene la lista de imágenes. Puede obtener el contenido href desde allí, es decir imageListWrapper.Images[0].Href. Debería ser bastante simple agregar un public List<string> GetImageLocations() a la clase ImageWrapper si lo desea. - JamieVer

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.