反序列化到List只选择一个项目

本文关键字:一个 项目 List 选择 反序列化 | 更新日期: 2023-09-27 18:16:07

我的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文件中第一个出现的元素。

反序列化到List只选择一个项目

对于您拥有的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对象,用一个新类表示每个节点TextScript,其中包含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:'temp'consoleapplication3'ConsoleApplication3'XMLFile1.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; }
    }
}