我的XML是这样的:
<FileExtensions>
<Text>
<Extension>602</Extension>
<Extension>ABW</Extension>
<Extension>ACL</Extension>
</Text>
<Script>
<Extension>AHK</Extension>
<Extension>APPLESCRIPT</Extension>
</Script>
</FileExtensions>
这些是我要反序列化到的类:
[XmlRoot("FileExtensions")]
public class FileExtensions
{
public FileExtensions()
{
Text = new List<Extensions>();
Script = new List<Extensions>();
}
[XmlElement("Text")]
public List<Extensions> Text;
[XmlElement("Script")]
public List<Extensions> Script;
}
public class Extensions
{
[XmlElement("Extension")]
public string name;
}
我是这样反序列化的:
FileExtensions extensions = new FileExtensions();
var deserializer = new System.Xml.Serialization.XmlSerializer(typeof(FileExtensions));
FileStream fs = new FileStream(filename, FileMode.Open);
XmlReader reader = new XmlTextReader(fs);
extensions = (FileExtensions)deserializer.Deserialize(reader);
由于某种原因,我的列表每个只有一个元素,它是XML文件中第一个出现的元素。
对于您拥有的Xml,由于中间节点,您当前的定义类并不完全匹配。如果你想让它工作,你可以把xml改成这样:
<FileExtensions>
<Text>602</Text>
<Text>ABW</Text>
<Text>ACL</Text>
<Script>AHK</Script>
<Script>APPLESCRIPT</Script>
</FileExtensions>
然后修改你的Extension
类,用[XmlText]
来分解Name
属性,以捕获节点内的文本。
或者你可以把你的定义改成如下的
[XmlRoot("FileExtensions")]
public class FileExtensions
{
[XmlElement("Text")]
public Text Text;
[XmlElement("Script")]
public Script Script;
}
public class Text
{
[XmlElement("Extension")]
public List<Extensions> Texts;
public Text()
{
Texts = new List<Extensions>();
}
}
public class Script
{
[XmlElement("Extension")]
public List<Extensions> Scripts;
public Script()
{
Scripts = new List<Extensions>();
}
}
public class Extensions
{
[XmlElement("Extension")]
public string name;
}
我在一个主机应用程序中运行了这个程序,效果不错。您有一个FileExtensions
对象,用一个新类表示每个节点Text
和Script
,其中包含Extensions
的列表。
试试这样:
[XmlArray("Text")]
[XmlArrayItem("Extension")]
public List<Extensions> Text;
[XmlArray("Script")]
[XmlArrayItem("Extension")]
public List<Extensions> Script;
这似乎是在主题上快速搜索一下的常用方法。
try change XmlElement to XmlArrayItem
[XmlArrayItem("Text")]
public List<Extensions> Text;
我不认为你的类结构反映你的xml结构很正确。如下所示:
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
FileExtensions extensions = new FileExtensions();
var deserializer = new System.Xml.Serialization.XmlSerializer(typeof(FileExtensions));
FileStream fs = new FileStream(@"d:tempconsoleapplication3ConsoleApplication3XMLFile1.xml", FileMode.Open);
XmlReader reader = new XmlTextReader(fs);
extensions = (FileExtensions)deserializer.Deserialize(reader);
}
}
[XmlRoot("FileExtensions")]
public class FileExtensions
{
public FileExtensions()
{
}
[XmlElement("Text")]
public Text Text { get; set; }
[XmlElement("Script")]
public Script Script { get; set; }
}
public class Text
{
[XmlElement("Extension")]
public List<string> Extensions { get; set; }
}
public class Script
{
[XmlElement("Extension")]
public List<string> Extensions { get; set; }
}
}