c#:将未知的xml元素反序列化为数组或列表

时间:2015-02-12 12:09:17

标签: c# xml xml-parsing xml-deserialization

给出以下XML:

<browser>
    <firefox company="mozilla"></firefox>
    <chrome company="google"></chrome>
    <ie company="microsoft"></ie>     
</browser>

这是我的反序列化代码:

[XmlRoot("browser")]
public class Browser
{
    //--List or Array
    List<BrowserType> browserTypes {get; set;}
}

public class BrowserType
{
    [XmlAttribute("company")]
    public string company {get; set;}
}

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Browser));
StreamReader sr = new StreamReader("browser.xml");
Browser browser = (Browser )xmlSerializer.Deserialize(sr);

foreach(var item in browserTypes)
{
    //--List browser types 
}

对于这个问题,我不能为XmlArrayItem执行以下代码,因为我不知道元素名称。

[XmlArray("browser")]
[XmlArrayItem("firefox")]
public BrowserType[] BrowserTypes{ get; set; }

如何将未知的xml元素反序列化为数组或列表?

1 个答案:

答案 0 :(得分:0)

<强>更新

好的,所以使用xml序列化,您可以指定BrowserType的列表,然后为每个派生类型指定XmlElement名称和类型。例如:

[XmlRoot("browser")]
public class Browser
{
    private readonly List<BrowserType> _items = new List<BrowserType>();
    [XmlElement("firefox", typeof(Firefox))]
    [XmlElement("chrome", typeof(Chrome))]
    [XmlElement("ie", typeof(IE))]
    public List<BrowserType> Items { get { return _items; } }
}

public class BrowserType
{
    [XmlAttribute("company")]
    public string Company { get; set; }
}

public class Firefox : BrowserType
{
}

public class Chrome : BrowserType
{
}


public class IE : BrowserType
{
}

原始条目:

如果您可以切换到XDocument,那么您可以获取根节点的所有后代,然后获取每个后代的名称。例如:

    static void Main(string[] args)
    {
        string xmlString = @"<browser>
<firefox company=""mozilla""></firefox>
<chrome company=""google""></chrome>
<ie company=""microsoft""></ie>     
</browser>";

        XDocument xdoc = XDocument.Parse(xmlString);
        var elementNames = xdoc.Root.Descendants()      // Get the descendants of the root node
                                    .Select(element => element.Name.LocalName);     // Project each XElement to its name
        string[] browserTypes = elementNames.ToArray();

        foreach (string browserType in browserTypes)
        {
            Console.WriteLine(browserType);
        }
    }

输出:

firefox
chrome
ie