XmlSerializer:反序列化为XMLElement

时间:2018-08-31 19:26:49

标签: c# xml

我有这个XML:

<A>
    <B>hello</B>
    <C>bye</C>
    <D>
        <E>111</E>
        <F>222</F>
    </D>
</A>

这堂课

[XmlRoot("A")]
public class A
{
    public string B { get; set; }
    public string C { get; set; }
    public System.Xml.XmlElement D { get; set; }
}

如您所见,我对将“ D”建模为类不感兴趣。

我正在以这种方式反序列化:

string xml = "<A><B>hello</B><C>bye</C><D><E>111</E><F>222</F></D></A>";
XmlSerializer serializer = new XmlSerializer(typeof(A));

using (StringReader reader = new StringReader(xml))
{
    A a = (A)serializer.Deserialize(reader);

    Console.WriteLine(a.D.OuterXml); // <-------
}

我当前的控制台输出是:

<E>111</E>

...这是一个奇怪的行为,因为<D>里面有两个项目,但是反序列化器只保存了第一个

问题:如何获得此控制台输出?

<E>111</E><F>222</F>

2 个答案:

答案 0 :(得分:2)

XmlAnyElement属性应用于属性D

它的内部Xml将包含<E>111</E><F>222</F>
<E>111</E><F>222</F>作为OuterXml无效,因为它缺少根元素。

[XmlRoot("A")]
public class A
{
    public string B { get; set; }
    public string C { get; set; }

    [XmlAnyElement()]
    public XmlElement D { get; set; }
}

答案 1 :(得分:1)

您可以在D上使用XmlAnyElement属性:

[XmlAnyElement]
public XmlElement D { get; set; }
  

指定成员(返回XmlElement或XmlNode对象的数组的字段)包含的对象表示任何在序列化或反序列化的对象中没有对应成员的XML元素。