如何反序列化给定的样本

时间:2014-05-14 15:43:33

标签: c# .net deserialization silverlight-5.0 xml-deserialization

请注意,此应用程序使用Silverlight5:

我有这样的xml:

<A>
  <B>
     <C>C1</C>
     <D>D1</D>  
  </B>
  <B>
     <E>E1</E>
     <F>F1<F1>
  </B> 
</A>

我在Parent类中遇到问题,即&#34; A&#34;。我将如何管理&#34; B&#34; ?以及如何在反序列化时访问两个B内的数据节点(子节点)?因为我将拥有A类的对象并且具有该对象我将如何区分这两个&#34; B&#34;接近&#34; C1,D1,E1,F1和#34;吗

My try to do this is :
[XmlRoot(ElementName = "A")]
    public class Parameter
    {
        [XmlElement("B")] //But what to do for another "B"
        public B B { get; set; }

    }

这是B级

    [XmlRoot(ElementName = "B")]
    public class Parameter
    {
        [XmlElement("C")]
        public string Label { get; set; }
        [XmlElement("D")]
        public string Type  { get; set; }
    }

但是E和F元素又是怎么做的? 如何在进行去核化时获得C1,D1和E1和F1?

Andy Jones之后编辑,假设我试图获得&#34; A&#34;的对象。像这样的课:

        XmlSerializer deserializer = new XmlSerializer(typeof(A));
        XmlReader reader = XmlReader.Create(new StringReader(xmlstring));//HerexmlString contains my xml given above
        A a = (A)deserializer.Deserialize(reader);

现在使用对象"a"我想访问C1,D1和C2,D2。 然后该怎么做?

2 个答案:

答案 0 :(得分:1)

对XML的小修正:

<F>F1<F1> 

应该是

<F>F1</F>

除此之外,看起来A类应该有B元素的集合:

public class A
{
    public List<B> B { get; set; }
}

并且您的B类应具有C,D,E和F的属性:

public class B
{
    public string C  { get; set; }
    public string D  { get; set; }
    public string E  { get; set; }
    public string F  { get; set; }
}

答案 1 :(得分:1)

您将无法使用序列化来处理此XML,因为您对B节点有两种不同的定义。

你能得到的最接近的是:

<A>
  <B>
     <C>C1</C>
     <D>D1</D>  
  </B>
  <B>
     <C>C2</C>
     <D>D2</D>
  </B> 
</A>

但首先你需要整理C#类。首先,您有两个具有相同名称的类和对“B”的错误引用。

A类应如下所示:

[XmlRoot(ElementName = "A")]
public class ParameterA
{
    [XmlElement("B")]
    public ParameterB B { get; set; }
}

......而“B”类应如下所示:

[XmlRoot(ElementName = "B")]
public class ParameterB
{
    [XmlElement("C")]
    public string Label { get; set; }

    [XmlElement("D")]
    public string Type  { get; set; }
}

这将允许您获得如下所示的XML:

<A>
  <B>
     <C>C1</C>
     <D>D1</D>  
  </B>
</A>

现在重复“B”。修改ParamaterA以获得B列表:

[XmlRoot(ElementName = "A")]
public class ParameterA
{
    [XmlElement("B")]
    public List<ParameterB> B { get; set; }
}

这将允许您创建上面的XML。

当您将XML反序列化为类时,您将能够像这样访问B的元素:

var firstParameter = a.B[0];
var secondParameter = a.B[1];

List<T>允许您按索引访问元素(就像数组一样)。

您还可以使用foreach迭代值:

foreach(ParameterB b in a.B)
{
    ...
}