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

时间:2011-11-30 11:29:23

标签: c# xml

这就是我的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文件中的元素。

4 个答案:

答案 0 :(得分:2)

使用Xml,由于中间节点,您当前的定义类不完全匹配。如果你想让它工作,你可以将xml改为这样的东西:

<FileExtensions>
    <Text>602</Text>
    <Text>ABW</Text>
    <Text>ACL</Text>      
    <Script>AHK</Script>
    <Script>APPLESCRIPT</Script>      
 </FileExtensions>

然后修改您的Extension类以使用Name伪装[XmlText]属性以捕获节点内的文本。

或者您可以将定义更改为以下内容

 [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列表。

答案 1 :(得分:2)

尝试这样的事情:

[XmlArray("Text")]
[XmlArrayItem("Extension")]
public List<Extensions> Text;

[XmlArray("Script")]
[XmlArrayItem("Extension")]
public List<Extensions> Script;  

这似乎是通过一些关于这个主题的快速搜索来实现这一目标的常用方法。

答案 2 :(得分:0)

尝试将XmlElement更改为XmlArrayItem

    [XmlArrayItem("Text")]
    public List<Extensions> Text;

答案 3 :(得分:0)

我认为你的类结构不能很好地反映你的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; }
    }
}