反序列化到列表只选择一个项目
问题描述:
这是我的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
对象,具有代表每个节点Text
和Script
的新类,其中包含Extensions
的列表。
答
尝试改变的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; }
}
}
谢谢。这工作。但是,我不得不在'Extensions'类中将其更改为'[XmlText]',否则我得到所有'null'值。 – xbonez
你打败了我,我刚刚编辑我的答案说这样=) – Chris