Sna*_*ake 4 .net c# xml system.xml
考虑以下XML:
<?xml version="1.0" encoding="utf-8"?>
<treelist id="foo" displayname="display">
<treelink id="link" />
</treelist>
Run Code Online (Sandbox Code Playgroud)
我已经设置了以下代码:
private static void Main(string[] args)
{
StreamReader result = File.OpenText(@"test.xml");
var xmlTextReader = new XmlTextReader(result.BaseStream, XmlNodeType.Document, null);
XDocument load = XDocument.Load(xmlTextReader);
var xmlSerializer = new XmlSerializer(typeof (TreeList));
var foo = (TreeList) xmlSerializer.Deserialize(load.CreateReader());
}
Run Code Online (Sandbox Code Playgroud)
这些是我的实体:
[Serializable]
[XmlRoot("treelink")]
public class TreeLink
{
[XmlAttribute("id")]
public string Id { get; set; }
}
[Serializable]
[XmlRoot("treelist")]
public class TreeList
{
[XmlAttribute("id")]
public string Id { get; set; }
[XmlAttribute("displayname")]
public string DisplayName { get; set; }
[XmlArray("treelist")]
[XmlArrayItem("treelist", typeof (TreeLink))]
public TreeLink[] TreeLinks { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是我无法反序列化treelink对象,在fooTreeLinks中始终保持为null.
我在这做错了什么?
谢谢
XmlElement在树链接的"列表"上使用.
[XmlElement("treelink")]
public TreeLink[] TreeLinks { get; set; }
Run Code Online (Sandbox Code Playgroud)
使用[XmlArray]并[XmlArrayItem]暗示您希望树链接在父类中的自己的包装容器中 - 换句话说,它需要像这样的xml:
<treelist id="foo" displayname="display">
<treelist>
<treelist id="link" />
</treelist>
</treelist>
Run Code Online (Sandbox Code Playgroud)
这里的诀窍总是从另一个方向开始.标记您的类以进行序列化,然后序列化您的类型的实例并查看它生成的xml.然后,您可以调整它,直到它看起来像您最终要反序列化的xml.这比想要猜测为什么xml没有正确反序列化要容易得多.