C# 将内部 XML 反序列化为字符串

标签 c# xml serialization

我有以下 XML:

<MyType>
  <MyProperty1>Value 1</MyProperty1>
  <MyProperty2>Value 2</MyProperty2>
  <MyNestedXml>
    <h1>Heading</h1>
    <p>Lorum</p>
    <p>Ipsum</p>
  </MyNestedXml>
</MyType>

这可以通过创建类和添加如下属性在 C# 中反序列化为 XML:

[Serializable]
public class MyType
{
    [XmlElement("MyProperty1")
    public string MyProperty1 { get; set; }

    [XmlElement("MyProperty2")
    public string MyProperty2 { get; set; }

    [XmlIgnore]
    public string MyNestedXml { get; set; }
}

但是,<MyNestedXml> 中的内部 XML元素变化并且不遵循一致的结构,我可以使用属性有效地映射它。

不幸的是,我无法控制 XML 结构。

我曾尝试使用具有 XmlNode 类型的 [XmlElement("MyNestedXml") 但这会导致第一个子节点被反序列化,而不是整个内部 XML。

我也曾尝试反序列化为一种字符串,但会抛出 InvalidOperationException:

“意外的节点类型元素。ReadElementString 方法只能在具有简单内容或空内容的元素上调用。”

问题是 MyNestedXml 元素的内容有时可能是元素数组,但有时可能是简单内容或空内容。

理想情况下,我可以使用不同的序列化属性(例如 [XmlAsString])来完全跳过序列化并按原样分配内部 XML。

预期结果将是一个类型为 MyType 的类,它具有属性 MyProperty1 =“Value 1”、属性 MyProperty2 =“Value 2”和属性 MyNestedXml =“<h1>Heading</h1><p>Lorum</p><p>Ipsum</p>”。

最佳答案

使其成为具有 XmlAnyElement 属性的 XmlElement 属性,序列化程序将反序列化任意 XML 结构。

[XmlRoot("MyType")]
public class MyType
{
    [XmlElement("MyProperty1")]
    public string MyProperty1 { get; set; }

    [XmlElement("MyProperty2")]
    public string MyProperty2 { get; set; }

    [XmlAnyElement("MyNestedXml")]
    public XmlElement MyNestedXml { get; set; }
}

关于C# 将内部 XML 反序列化为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40621558/

相关文章:

c# - 我将我的服务注入(inject)我的 Controller 。我应该将我的服务注入(inject)到我的 ViewModel 中吗?

java - 如何在java中解析XML以使用STAX将值保存在数据库中?

xml - 使用XPath从XML获取特定节点

javascript - 如何将 Python 字典序列化为 JavaScript 对象文本?

c# - 隐藏表单时,Form.Invoke() 不会运行,

c# - 如何在 XAML 中管理 CheckBox?

java - 从 DOM 获取 XML 字符串

java - 将内部 JSON 对象提取为 Jackson 中的 String

c# - 复杂 .Net 对象图的快速读/写

c# - 您如何检查传递给委托(delegate)的参数?