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

本文关键字:扁平化 内部 层次结构 属性 对象 序列化 XML | 更新日期: 2023-09-27 18:12:56

我正在使用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时遇到困难。

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

应该可以了

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>

我不知道有一种方法可以做到这一点,而不添加属性到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;
}