【问题标题】:Deserialize a xml反序列化一个xml
【发布时间】:2012-11-02 02:50:33
【问题描述】:

我需要创建一个可以从此 XML 反序列化的对象

  <Item>
    <Description>Timber(dry)</Description>
    <Measure Type="VOLUME">
      <Value>1.779</Value>
      <Units>m3</Units>
    </Measure>
    <Measure Type="WEIGHT">
      <Value>925.08</Value>
      <Units>Kilogram</Units>
    </Measure>
    <Measure>
      <Value>1</Value>
      <Units>Units</Units>
    </Measure>
  </Item>

我的问题是 Measure,它需要是某种列表,但是当我创建一个 列出它序列化不正确

  <Item>
    <Description>Timber(dry)</Description>
    <Measures>   <--- Dont want this <Measures> tag
     <Measure Type="VOLUME">
      <Value>1.779</Value>
      <Units>m3</Units>
     </Measure>
     <Measure Type="WEIGHT">
      <Value>925.08</Value>
      <Units>Kilogram</Units>
     </Measure>
     <Measure>
      <Value>1</Value>
      <Units>Units</Units>
     </Measure>
   </Measures> <--- 
  </Item>

这就是我目前所拥有的

public class Item
  {
    public Item()
    {
      this.Measures = new List<Measure>();
    }    

    public string Description { get; set; }

    public List<Measure> Measures { get; set; }
  }

  public class Measure
  {

    public string Value { get; set; }

    public string Units { get; set; }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Type { get; set; }
  }

【问题讨论】:

  • .. 并且不正确.. ?
  • 我已经更新了问题。也许它会澄清一点

标签: c# xml xml-serialization xml-deserialization


【解决方案1】:

您需要使用[XmlElement] 属性装饰Measures 属性,以向序列化程序指示它需要作为(裸)元素进行序列化(和反序列化),而不是将它们包装在另一个元素中。

public class StackOverflow_13188624
{
    const string XML = @"  <Item>
                            <Description>Timber(dry)</Description>
                            <Measure Type=""VOLUME"">
                              <Value>1.779</Value>
                              <Units>m3</Units>
                            </Measure>
                            <Measure Type=""WEIGHT"">
                              <Value>925.08</Value>
                              <Units>Kilogram</Units>
                            </Measure>
                            <Measure>
                              <Value>1</Value>
                              <Units>Units</Units>
                            </Measure>
                          </Item>";

    public class Item
    {
        public Item()
        {
            this.Measures = new List<Measure>();
        }

        public string Description { get; set; }
        [System.Xml.Serialization.XmlElement(ElementName = "Measure")]
        public List<Measure> Measures { get; set; }
    }

    public class Measure
    {
        public string Value { get; set; }
        public string Units { get; set; }
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string Type { get; set; }
    }

    public static void Test()
    {
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(XML));
        XmlSerializer xs = new XmlSerializer(typeof(Item));
        Item item = (Item)xs.Deserialize(ms);
        Console.WriteLine(item.Measures);
    }
}

【讨论】:

猜你喜欢
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2011-03-03
相关资源
最近更新 更多