c#将内部XML反序列化为字符串
本文关键字:字符串 反序列化 XML 内部 | 更新日期: 2023-09-27 18:18:09
我有以下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结构。
我已经尝试使用XmlElement("MyNestedXml")与XmlNode类型,但这导致在第一个子节点被反序列化,而不是整个内部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; }
}
我已经设法解决了这个问题…
我创建了一个要反序列化到的类:
public class RichText : IXmlSerializable
{
public string Raw { get; set; }
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
Raw = reader.ReadInnerXml();
}
public void WriteXml(XmlWriter writer)
{
writer.WriteString(Raw);
}
}
这允许我有以下类定义:
[Serializable]
public class MyType
{
[XmlElement("MyProperty1")
public string MyProperty1 { get; set; }
[XmlElement("MyProperty2")
public string MyProperty2 { get; set; }
[XmlElement("MyNestedXml")]
public RichText MyNestedXml { get; set; }
}
我现在可以使用InstanceOfMyType.MyNestedXml.Raw
来获得内部XML作为字符串。如果我这样选择,我可以覆盖RichText
的.ToString()
方法来返回Raw
属性。
希望这篇文章能帮助到更多的人。
如果XML的结构不一致,则必须使用XMLReader。
我建议您查看这个链接,了解如何使用XMLReader的递归模式。这可能也是解析XML最快的方法。
使用递归函数遍历XML