我使用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时遇到了困难。
答案 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;
}