我正在尝试反序列化XML文档,其中一个节点可以这样表示:
<n1 zone="00000" id="0000" />
或者这个:
<n2 zone="00000" id="0000" />
或者这个:
<n3 zone="00000" id="0000" />
在我的文档中,我将始终有一个“n1”节点或一个“n2”节点或一个“n3”节点。我想将所有这些片段反序列化为此类的一个实例:
[Serializable]
public class N
{
[XmlAttribute("zone")]
public string Zone { get; set; }
[XmlAttribute("id")]
public string Id { get; set; }
}
但我没有设法做到这一点。文档建议使用XmlChoiceIdentifier属性来完成此操作,但也许我以错误的方式使用它。
有什么想法吗?
PS:我知道我可以创建三个类:N1,N2和N3,并将它们映射到我不同类型的XML片段。但我更喜欢更清洁的解决方案。
答案 0 :(得分:1)
假设你有类似的东西:
<?xml version="1.0"?>
<ns>
<n1 id="0000" zone="00000"/>
<n2 id="0000" zone="00000"/>
<n3 id="0000" zone="00000"/>
</ns>
您可以使用 LINQ to XML :
XDocument document = XDocument.Load(path);
XElement parentNode = document.Element("ns");
var childNodes = parentNode.Elements().Where(x => x.Name.ToString().StartsWith("n")); //this prevent from take elements wich didn't start with n
List<N> list = new List<N>();
foreach (XElement element in childNodes) {
N n = new N(){
Id = element.Attribute("id").Value,
Zone = element.Attribute("zone").Value
};
list.Add(n);
}
答案 1 :(得分:0)
以下是关于如何使用XmlChoiceIdentifier的一个相当容易理解的读物:
http://msdn.microsoft.com/en-us/magazine/cc164135.aspx
如果你真的遇到这个问题,那么你总是可以使用XSL转换来进行映射。
答案 2 :(得分:0)
您可以使用LINQ-To-Xml
XDocument x = XDocument.Parse(
"<root><n1 zone=\"0000\" id=\"0000\"/><n2 zone=\"0001\" id=\"0011\"/><n3 zone=\"0002\" id=\"0022\"/></root>");
var result = from c in x.Element("root").Descendants()
select new N { Zone = c.Attribute("zone").Value,
Id = c.Attribute("id").Value };
它没有使用序列化器,我认为你的目标是它,但它是一种前进的方式。