如何使用XmlSerializer从数组中提取属性?

时间:2012-07-27 20:00:33

标签: c# xml-serialization deserialization xmlserializer xml-deserialization

我想使用XmlSerializer提取图像属性“href”。

如果我的设置如下所示,它将起作用:

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

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

但如果它看起来像这样:

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

这是我的对象

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

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

    }

1 个答案:

答案 0 :(得分:1)

我尝试了多种方法来尝试让序列化程序符合这个XML而没有太多运气。

你可能只想做这样的事情:

    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();
            }
        }
    }

我已经做了一些更多的尝试,并提出了一种使用序列化并获得所需XML的方法:

[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; }
}