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

标签 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类(class)。这将使我能够在我正在寻找的层次结构中编写 XML 元素。使用此处生成的 XML 的程序比 C# XML 工具简单得多。较简单的解析器在处理 XmlSerializer 生成的 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>

关于c# - 如何在 XML 中序列化对象,同时展平属性的内部层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7935971/

相关文章:

c# - 触发ListViewItem命令

c# - 如何检查一个字符串是否是一个有效的url

c# - "late-bound access to the destination object"是什么意思?

Java XML 解析器无需过多内存分配

java - 如何从 xml 字符串内容构建 HierarchicalConfiguration 对象?

c# - 从 Windows 窗体异步执行存储过程然后断开连接?

c# - Entity Framework - 避免 "lookup"实体最初在另一个上下文中加载时获得添加状态

.net - Azure Cmdlet : String was not recognized as a valid Boolean

xml - XPath 获取没有父节点的所有子节点(元素、注释和文本)

c# - Xamarin MVVM 处理文件