【发布时间】:2010-01-07 14:19:07
【问题描述】:
所以我试图简单地装饰一个类以将其序列化为 XML。这是我的问题的一个例子。
[XmlElement("Dest")]
public XmlNode NewValue { get; set; }
这里真正的问题是,有时在此实现中 XmlNode 可以是 XmlElement 或 XmlAttribute。当它是一个元素时,这段代码可以正常工作,但是当它作为一个属性出现时,序列化程序会抛出以下错误:
System.InvalidOperationException:无法将 XmlAttribute 类型的节点写入元素值。使用带有 XmlNode 或 XmlAttribute 数组的 XmlAnyAttributeAttribute 将节点写入属性。
我尝试了 XmlAnyAttribute,但也失败了。简单来说,如何序列化一个 XmlNode?p>
为了记录,我在下面标记了正确的答案。你有点得破解它。这大致是我自己实现的,以防其他人遇到这个问题。
[XmlIgnore()]
public XmlNode OldValue { get; set; }
[XmlElement("Dest")]
public XmlNode SerializedValue
{
get
{
if (OldValue == null)
{
return null;
}
if (OldValue.NodeType == XmlNodeType.Attribute)
{
XmlDocumentFragment frag = OldValue.OwnerDocument.CreateDocumentFragment();
XmlElement elem = (frag.OwnerDocument.CreateNode(XmlNodeType.Element, "SerializedAttribute", frag.NamespaceURI) as XmlElement);
elem.SetAttribute(OldValue.Name, OldValue.Value);
return elem;
}
else
{
return OldValue;
}
}
set
{
if (value == null)
{
OldValue = null;
return;
}
if ((value.Attributes != null) && (value.NodeType == XmlNodeType.Element) && ((value.ChildNodes == null) || (value.ChildNodes.Count == 0)))
{
OldValue = value.Attributes[0];
}
else
{
OldValue = value;
}
}
}
【问题讨论】:
-
您希望它如何将属性序列化为节点?
-
我知道 XmlElement 尝试序列化它是错误的,但那里没有 XmlNode 选项。由于 XmlAttribute 类是 XmlNode 类的子类,我希望它能够很好地处理它。
标签: c# .net xml xml-serialization serialization