给出以下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元素反序列化为数组或列表?
答案 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