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

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

问题描述:

这是我的XML看起来像:反序列化到列表只选择一个项目

​​

这些都是我反序列化的类:

[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类以decoarate的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; 
} 

你的定义更改为类似的我在CONSLE应用跑这和工作的享受。您有一个FileExtensions对象,具有代表每个节点TextScript的新类,其中包含Extensions的列表。

+0

谢谢。这工作。但是,我不得不在'Extensions'类中将其更改为'[XmlText]',否则我得到所有'null'值。 – xbonez

+0

你打败了我,我刚刚编辑我的答案说这样=) – Chris

尝试改变的XmlElement到XmlArrayItem

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

试过但没有运气 – xbonez

尝试是这样的:

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

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

这似乎是从关于这个问题有点快谷歌搜索这样的常用方法。

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