如何在展平内部属性的内部层次结构时序列化XML中的对象

时间:2011-10-28 23:44:29

标签: c# .net xml serialization

我使用XmlSerializer序列化对象,在我的对象中指定属性以向XmlSerializer发出指令,如下所示:

[XmlType("FooElement")]
public class Foo {

    [XmlAttribute("Type")]
    public string fooType;

    [XmlElement("Name")]
    public string Name;

    [XmlElement("Bar")]
    public Bar BarObject;
}

public class Bar {
    [XmlElement("Message")]
    public string BarString;
    [XmlElement("From")]
    public string FromName;
}

当序列化Foo类型的对象时,将生成以下XML:

<Foo Type="TypeName">
  <Name>Name of Foo</Name>
  <Bar>
     <Message>5:00 Somewhere</Message>
     <From>Jane Smith</From>
  </Bar>
</Foo>

我想要的是将Foo中的所有数据平展到相同的水平,如下所示:

<Foo Type="TypeName">
  <Name>Name of Foo</Name>
  <Message>5:00 Somewhere</Message>
  <From>Jane Smith</From>
</Foo>

对于我的需求而言,Foo和Bar保持独立的课程非常重要。除了合并类之外,在序列化为XML时,如何将Foo的元素展平为单个级别?如果可以通过使用[Property]标签来完成它是最好的。我愿意改变我的XML序列化方法。

编辑:我已切换到XmlWriter课程。这将让我在我正在寻找的层次结构中编写XML元素。使用此处生成的XML的程序比C#XML工具简单得多。更简单的解析器在XmlSerializer生成XML时遇到了困难。

2 个答案:

答案 0 :(得分:4)

这应该这样做

void Main()
{
    var foo = new Foo
    {
        Name = "name",
        fooType = "type",
        BarObject = new Bar { BarString = "bar"}
    };

    var s = new XmlSerializer(typeof(Foo));
    using (var writer = new StringWriter())
    {
        s.Serialize(writer, foo);
        writer.ToString().Dump();
    }
}


public class Foo {

    [XmlAttribute("Type")]
    public string fooType;

    [XmlElement("Name")]
    public string Name;

    [XmlElement("Message")]
    public Bar BarObject;
}

public class Bar {

    [XmlText]
    public string BarString;
}

输出结果为:

<?xml version="1.0" encoding="utf-16"?>
<Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Type="type">
  <Name>name</Name>
  <Message>bar</Message>
</Foo>

答案 1 :(得分:2)

我不知道如何在不向Foo添加映射到Bar的相应属性的属性的情况下执行此操作。例如:

[XmlType("FooElement")]
public class Foo {

    [XmlAttribute("Type")]
    public string fooType;

    [XmlElement("Name")]
    public string Name;

    [XmlIgnore()]
    public Bar BarObject;

    [XmlElement("Message")]
    public string BarMessage
    {
       get {
          return this.Bar.BarString;
       }
       set {
          this.Bar.BarString = value;
       }
}

public class Bar {
    public string BarString;
}