【问题标题】:How to Deserialize the given sample如何反序列化给定的样本
【发布时间】:2014-05-14 15:43:33
【问题描述】:

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

我有这样的xml:

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

我只是在父类“A”中遇到问题。我将如何管理“B”的重复?以及如何在反序列化时访问两个 B 内的数据节点(子节点)?因为我将拥有 A 类的对象,并且使用该对象 我将如何区分两个“B”以访问“C1,D1,E1,F1”?

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之后编辑,假设我尝试像这样获取“A”类的对象:

        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 。 那该怎么做呢?

【问题讨论】:

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


    【解决方案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”。修改 ParamateA 以获得 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&lt;T&gt; 允许您按索引访问元素(就像数组一样)。

    您还可以使用 foreach 迭代值:

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

    【讨论】:

    • 感谢您的回答,您似乎与我想知道的很接近。我还有两个问题,谢谢你也能回答他们以消除疑问。(1)我必须重复“B”和(2)我将如何访问“C2”和“D2”使用 B 类包含的对象说“b”(B b;)?重复的 B 将如何使我们访问 C1、D1、C2、D2?您能否为此提供一段代码(假设 xml 存储在“String xmlStringVarible;”中)非常感谢
    • 当您反序列化为 A 时,您将能够使用 A.B[0] 和 A.B[1] 访问 B 的重复。
    • 我已经为你编辑了这个问题,请看最后一部分以了解我想要什么。
    • 但它不是数组。您能否为我编写一个参考代码来制作我编辑的部分代码作为这样做的帮助?真的会有帮助吗?
    【解决方案2】:

    对 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; }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-27
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多