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> "。

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

将其设置为具有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

相关文章: