我有以下 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/