C# 反序列化:将几种节点合并到同一对象中

C# 反序列化:将几种节点合并到同一对象中,c#,deserialization,C#,Deserialization,我正在尝试反序列化XML文档,其中一个节点可以表示为: <n1 zone="00000" id="0000" /> 但我没能做到。文档建议使用XmlChoiceIdentifier属性来实现这一点,但可能我用错了 有什么想法吗 PS:我知道我可以创建三个类:N1、N2和N3,并将它们映射到不同类型的XML片段。但我更喜欢更干净的解决方案。这里有一个关于如何使用XmlChoiceIdentifier的相当容易理解的阅读: 如果您在这方面确实有困难,那么您可以始终使用XSL转换来首先

我正在尝试反序列化XML文档,其中一个节点可以表示为:

<n1 zone="00000" id="0000" />
但我没能做到。文档建议使用XmlChoiceIdentifier属性来实现这一点,但可能我用错了

有什么想法吗


PS:我知道我可以创建三个类:N1、N2和N3,并将它们映射到不同类型的XML片段。但我更喜欢更干净的解决方案。

这里有一个关于如何使用XmlChoiceIdentifier的相当容易理解的阅读:


如果您在这方面确实有困难,那么您可以始终使用XSL转换来首先进行映射。

您可以使用LINQ到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 };
XDocument x=XDocument.Parse(
"");
var result=来自x.Element(“根”).subjects()中的c
选择新的N{Zone=c.Attribute(“Zone”).Value,
Id=c.Attribute(“Id”).Value};

它并没有使用序列化程序,我认为这是您的目标,但它是一种前进的方式。

假设您有类似于:

<?xml version="1.0"?>
<ns> 
  <n1 id="0000" zone="00000"/> 
  <n2 id="0000" zone="00000"/> 
  <n3 id="0000" zone="00000"/> 
</ns>

您可以使用LINQ转换为XML:

XDocument document=XDocument.Load(路径);
XElement parentNode=document.Element(“ns”);
var childNodes=parentNode.Elements(),其中(x=>x.Name.ToString().StartsWith(“n”)//此阻止从take元素开始,该元素不是以n开头的
列表=新列表();
foreach(子节点中的XElement元素){
N=新的N(){
Id=元素属性(“Id”).值,
区域=元素。属性(“区域”)。值
};
列表。添加(n);
}

我们想到了继承。每个N*-类都继承自NAlso XPath:KyorCode:这正是我搜索要避免的解决方案:),但如果我没有找到其他方法,我将使用继承。
[Serializable]
public class N
{
    [XmlAttribute("zone")]
    public string Zone { get; set; }

    [XmlAttribute("id")]
    public string Id { get; set; }
}
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 };
<?xml version="1.0"?>
<ns> 
  <n1 id="0000" zone="00000"/> 
  <n2 id="0000" zone="00000"/> 
  <n3 id="0000" zone="00000"/> 
</ns>
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);
}