警告 - 我不是xml专家。
这就是我所拥有的:
<Fields>
<Field name="BusinessName" look-up="true">My Business</Field>
<Field name="BusinessType" look-up="false">Nobody really knows!</Field>
</Fields>
这将映射回:
[XmlArrayItem(ElementName = "Field")]
public List<UserInfoField> Fields;
和
[Serializable, XmlRoot("Field")]
public class UserInfoField
{
[XmlAttributeAttribute("name")]
public string Name;
[XmlText]
public string Value;
[XmlAttributeAttribute("look-up")]
public bool LookUp;
}
无论如何都要获得此序列化输出:
<Fields>
<BusinessName look-up="true">My Business</BusinessName>
<BusinessType look-up="false">Nobody really knows!</BusinessType>
</Fields>
我知道这可能过于神奇,并且可以想象有一个很好的理由这不应该起作用......但我认为它可能,这是一个值得问的好地方:)
答案 0 :(得分:3)
XmlSerializer(实际上,所有Framework序列化程序实际上)本地序列化类型,而不是名称。归属装饰器允许您在名称之前使用它,但这些是静态运行时查找,因此它们不允许您使用该结构插入序列化过程。
相反,您要做的是编写自己的序列化例程。这将允许您覆盖所需的节点命名序列 - 基本上插入Name字段的属性作为节点名称。您对实现IXmlSerializable接口感兴趣。请记住,这也会影响反序列化。
答案 1 :(得分:1)
你可以同时使用 [XmlArray] 和 [XmlArrayItem] 和属性,就像这里所说http://msdn.microsoft.com/en-us/library/2baksw0z(v=vs.71).aspx
[XmlArray("Fields")]
[XmlArrayItem("Field")]
public List<UserInfoField> Fields;
但是,我建议你序列化arroung根级别:
<root>
<Fields>
<Field name="BusinessName" look-up="true">My Business</Field>
<Field name="BusinessType" look-up="false">Nobody really knows!</Field>
</Fields>
</root>
因此,您将拥有一个包含根和列表的主类以及该元素的另一个类:
[Serializable, XmlRoot("Root")]
public class Fields
{
[XmlArray("Fields")]
[XmlArrayItem(ElementName = "Field")]
public List<UserInfoField> Fields;
}
[Serializable, XmlRoot("Field")]
public class UserInfoField
{
[XmlAttributeAttribute("name")]
public string Name;
[XmlText]
public string Value;
[XmlAttributeAttribute("look-up")]
public bool LookUp;
}