在.Net中使用XML序列化序列化对象时,如何以所需格式获取xml

时间:2009-10-21 05:08:35

标签: c# xml-serialization

如何获取内部元素而不是根元素的属性?

[XmlRoot("Root")]
public class Test
{
    string type=null;
    int value=0;
    public string Type
    {
        get { return type; }
        set { type=value; }
    }
    [XmlAttribute]
    public int Value
    {
        get { return type; }
        set { type=value; }
    }
}

将导致

<Root Value="">
    <Type>
    </Type>
</Root>

但我想要

<Root >
    <Type Value="">
    </Type>
</Root>

请帮帮我。提前谢谢。

3 个答案:

答案 0 :(得分:2)

XmlSerializer旨在成为对象模型和xml之间的自然映射;那么,答案是将您的DTO与您的xml结构相同。在这种情况下,通过将Test包装在第二个对象中:

public class Root {
    public Test Type {get;set;}
}

替代方案是实施IXmlSerializable,但这是努力,容易出错。为序列化目的而要求单独的对象表示并不罕见 - 不应假设您的“常规”业务/数据对象必然直接适用于序列化。

答案 1 :(得分:1)

XmlSerializer不是超级可自定义的。最接近实现这一点(不依赖于自定义序列化)是一个包装类:

[XmlRoot("Root")]
public class Test
{
    public TypeData Type { get; set; }

    // ...
}

class TypeData
{
    public string Data { get; set; }

    [XmlAttribute]
    public int Value { get; set; }
}

在这种情况下,你最终会得到:

<Root>
  <Type Value="">
    <Data>...</Data>
  </Type>
</Root>

答案 2 :(得分:0)

[XmlRoot("Root")]
public class Test
{
    TypeClass type=null;
    [XmlElement("Type")]
    public TypeClass Type
    {
       get{return type;}
       set{type=value;}
    }
}
[XmlRoot("Type")]
public class TypeClass
{
   int _value=0;
   [XMlAttribute]
   public int Value
   {
      get{return _value;}
      set{_value=value;}
   }
}

试试这个