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

时间:2016-11-15 23:29:42

标签: c# xml serialization

我有以下XML:

Fragment

通过创建类和添加属性,可以在C#中将其反序列化为XML:

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

但是,[Serializable] public class MyType { [XmlElement("MyProperty1") public string MyProperty1 { get; set; } [XmlElement("MyProperty2") public string MyProperty2 { get; set; } [XmlIgnore] public string MyNestedXml { get; set; } } 元素中的内部XML会有所不同,并且不会遵循一致的结构,我可以使用属性进行有效映射。

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

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

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

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

问题是MyNestedXml元素的内容有时可能是一个Elements数组,但在其他时候可能是简单或空内容。

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

预期结果将是MyType类型,其属性为MyProperty1 =&#34; <MyNestedXml>&#34;,属性MyProperty2 =&#34; Value 1&#34;,和属性MyNestedXml =&#34; Value 2&#34;。

3 个答案:

答案 0 :(得分:3)

将其设为XmlElement属性,XmlAnyElement属性,序列化程序将反序列化任意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; }
}

答案 1 :(得分:3)

我设法解决了这个问题......

我创建了一个反序列化的类:

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作为字符串。如果我这样选择,我可以覆盖.ToString()的{​​{1}}方法,也可以返回RichText属性。

希望将来帮助其他人。

答案 2 :(得分:0)

如果XML的结构不一致,您将不得不使用XMLReader。

我建议您查看此链接,了解有关如何使用XMLReader的递归模式。它也可能是解析XML的最快方法。

Traverse a XML using Recursive function