0

我正在尝试反序列化一个 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 片段。但我更喜欢更清洁的解决方案。

4

3 回答 3

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);
}
于 2012-10-17T10:11:50.037 回答
0

这是关于如何使用 XmlChoiceIdentifier 的相当容易理解的读物:

http://msdn.microsoft.com/en-us/magazine/cc164135.aspx

如果您真的对此有疑问,那么您总是可以先使用 XSL 转换来进行映射。

于 2012-10-17T09:52:48.053 回答
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 };

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

于 2012-10-17T10:05:41.130 回答