如何序列化 XMLNode 类型的属性

Posted

技术标签:

【中文标题】如何序列化 XMLNode 类型的属性【英文标题】:How to serialize a property of type XMLNode 【发布时间】:2014-08-30 06:50:15 【问题描述】:

我有一个公共类,其属性如下:

[serializable]
public class Data

Public XmlNode VariableXMLData get; set;

VariableXMLData 节点又包含一个 xml 节点。例如,说:

VariableXMLData.OuterXML is "
<VariableXMLData>
<Change>Major</Change><Reason>Unknown</Reason>
</VariableXMLData> ". 

问题是:当我序列化这个类时,输出如下:

<Data>
<VariableXMLData>
<VariableXMLData>
<Change>Major</Change><Reason>Unknown</Reason>
</VariableXMLData>
</VariableXMLData>
</Data> 

我怎样才能避免这里的元素名称有多个标签。我只想为&lt;VariableXMLData&gt; 提供一个节点

【问题讨论】:

不会在另一边正确反序列化,然后简单地把你的xml节点放在里面吗? 不,问题是 - 它不会总是反序列化的属性。它可以是任何东西。基本上传入 xml 的协议是:它应该用根节点包装为 并且子节点可以是任何数量,也可以是任何数量 试一试 Cedric 的回答。如果没有,并且根据您的需要,您可能可以简单地 JSON 它。它应该可以处理 XML。 我对 Cedric 的回应仍有一些疑问。等着试一试! 【参考方案1】:

我会选择这样的:

[serializable]
public class Data

    [XmlIgnore]
    Public XmlNode VariableXMLData get; set;

    [XmlElement(ElementName="VariableXMLData")]
    Public XmlNode VariableXMLDataParts 
      get
         //handle the deserialization => returning the nodes you wish to return
         // example only return the roots descendants...
      
      set
           // handle your serialization if needed
      

不确定,但我认为您可以将第二种方法放在内部或受保护,因此它不会显示给其他程序集

【讨论】:

感谢塞德里克!只是想重申你的建议,以确保我理解正确。在“VariableXMLDataParts”的获取部分,我是否返回子节点?考虑我的例子,它应该返回节点 "MajorUnknown" 吗?由于这可能很多,我应该使用 NodeList 还是什么?另外,我不能反序列化它,因为它可以是任何 xmlstring。唯一的协议是:xml 字符串应该用 标记 括起来 是的,您可以返回子节点,如果返回 ChildNodes,则返回的是 xmlNodeList。只要包含其他 xml 节点,您仍然可以获取 childNodes 的任何名称。这是正确的吗? 嗨 Cedric,我将 [XmlAnyElement] 标记添加到 Public XmlNode VariableXMLData 属性。那确实解决了我的问题。现在我没有在我的序列化字符串中得到重复的 标记。但是,我想弄清楚我的方法是否正确。它可能有一些错误的含义吗?请让我知道您对此的想法。 可以肯定的是,您只是这样做了:删除 [XmlIgnore] 属性并将其替换为 [XmlAnyElement] 属性,而无需添加第二个属性,例如 VariableXMLDataParts,现在您得到了没有外部标签的 innerXml ?

以上是关于如何序列化 XMLNode 类型的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中序列化时删除列表类型属性名称以及 和 [] 括号

如何在 json 序列化时使用 DefaultContractResolver 覆盖具有字符串值的复杂类型属性

如何序列化具有填充数组的对象类型属性的类

使用“多类型”属性序列化 Json 对象

如何检查多个 XMLNode 属性的空值?

如何在 C# 中从 XmlNode 读取属性值?