【发布时间】:2012-02-06 11:08:16
【问题描述】:
我正在使用XmlSerializer。我的班级:
[Serializable]
[XmlRoot(ElementName="MyClass")]
public class MyClass
{
public string Value;
}
我想对其进行序列化,以便 Value 最终成为名为(例如)“文本”的子元素的属性。
期望的结果:
<MyClass>
<Text Value="3"/>
</MyClass>
但是NOT(这就是将Value标记为XmlAttribute的效果)
<MyClass Value="3">
</MyClass>
而 NOT(这会将 Value 标记为 XmlElement):
<MyClass>
<Value>3</Value>
</MyClass>
我如何做到这一点?
我知道我可以将Value 的类型从字符串更改为另一个可序列化的自定义类。
不幸的是,我有很多这样的属性,所以我需要创建几十个小类。
有没有更快的解决方案?
编辑:
回应您的 cmets:
不,不是每个属性都必须序列化为名为“Text”的子元素。子元素的名称是唯一且明确的。
-
示例输出 XML:
<visibility> <site visible="yes"/> <comparator visible="no"/> <expiration days="7"/> <comment>blahblahblah</comment> <visibility> 示例类:
!
[XmlRoot(ElementName="Visibility")]
public class Visibility
{
[XPath("/site@visible")] // if only this was possible!
public string OnSite
{
get { return SiteVisible ? "yes" : "no"; }
}
[XPath("/comparator@visible")] // as above...
public string InComparator
{
get { return ComparatorVisible ? "yes" : "no"; }
}
[XmlIgnore]
public bool SiteVisible;
[XmlIgnore]
public bool ComparatorVisible;
[XPath("/expiration@days")] // as above...
public int ExpiresAfterDays;
[XmlElement("comment")] // this is easy
public string Comment;
}
【问题讨论】:
-
您能否提供完整的所需 XML 结构(3-5 个元素/属性)和适当的类?
-
我有一个解决方案 - 但如果每个属性都需要序列化为名为“文本”的元素 - 所以您需要根据基里尔的要求提供更多示例。拥有多个“文本”的问题在于,不可能以相反的方向反序列化,因为序列化程序无法确定每个“文本”映射到哪个属性。请提供更多,以便我们提供帮助。
-
顺便说一句 - 我怀疑你的意思是 [XmlIgnore] 而不是 [NonSerialized]。
-
哦,没错。
NonSerialized用于二进制序列化。 -
您寻求的功能不存在。硬着头皮写一百个小班。它只执行一次。
标签: c# xml serialization xml-serialization