我有以下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;。
答案 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的最快方法。