c# - .NET 序列化 XmlNode 问题

标签 c# .net xml xml-serialization serialization

所以我试图简单地修饰一个类以将其序列化为 XML。这是我的问题的一个例子。

[XmlElement("Dest")]
    public XmlNode NewValue { get; set; }

这里真正的问题是有时在此实现中 XmlNode 可以是 XmlElement 或 XmlAttribute。当它是一个元素时,这段代码工作正常,但是当它作为一个属性出现时,序列化程序会抛出以下错误:

System.InvalidOperationException:无法将 XmlAttribute 类型的节点写入元素值。使用带有 XmlNode 或 XmlAttribute 数组的 XmlAnyAttributeAttribute 将节点写为属性。

我尝试了 XmlAnyAttribute,但也失败了。简单地说,我如何序列化 XmlNode?

为了记录,我在下面标记了正确答案。你有点得破解它。以下是我自己实现的大致内容,以防其他人遇到此问题。

    [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;
            }
        }
    }

最佳答案

你可以尝试破解它(我同意它不是很好):

XmlNode v;

[XmlElement("Dest")]
public XmlNode NewValue { get{return v as XmlElement;} set{v = value;} }

[XmlAttribute("Dest")]
public NewValue { get{return v as XmlAttribute;} set{v = value;} }

关于c# - .NET 序列化 XmlNode 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2020912/

相关文章:

c# - SynchronizationContext 可以不在 WinForms/WPF 应用程序中使用吗?

c# - 查找 xml 中所有不是标签的 'more or less than' 字符

php - 解析大型 XML 数据

c# - 创建一个 IEqualityComparer<IEnumerable<T>>

c# - 如何在 .Net 中读取 .ETL 文件?

javascript - 加载页面后使用 Javascript 创建 ASP.NET 标签

c# - 无法添加对 SharePoint 列表服务的引用

c# - 缓冲区缓存清理时出现“超时已过期”错误

c# - Dispose 方法中有多少工作?

html - XSLT 转换从混合内容中移除 HTML 元素