XmlSerializer - 包含text + xml + text的节点

时间:2014-09-23 12:52:10

标签: c# xml xml-deserialization

我有一个节点,可以包含text或xml,text + xml或text + xml + text。前两个案例我用

解决了
    [XmlAnyElement]
    [EditorBrowsable(EditorBrowsableState.Never)]
    public XmlElement[] TextNodes { get; set; }

    [XmlText]
    public string InnerText { get; set; }

    [XmlIgnore]
    public string Text 
    {
        get
        {
            return String.Format("{0}{1}", InnerText, TextNodes.Aggregate(String.Empty, (current, documentNode) => current + documentNode.OuterXml));
        }
    }

但是,在xml之后有文本的最后一种情况我无法找到解决方案。

XML

<node>
 somtext <p>moretext</p> even more text
</node>

我的代码将在Text中输出:

sometext <p>moretext</p>

我需要:

sometext <p>moretext</p> even more text

2 个答案:

答案 0 :(得分:5)

您想要的是混合内容,并在XmlSerializer中受支持。

像这样写你的课

[Serializable]
public class TestClass
{
    [XmlText(typeof(string))]
    [XmlAnyElement]
    public object[] Items { get; set; }
}

并将所有元素放在同一个对象数组中

答案 1 :(得分:0)

你必须使用CDATA - 因为标签&lt;&gt;将打破XML-Structure使用CDATA或编码你的字符串(可能是b64)

看看这里:

how-do-you-serialize-a-string-as-cdata-using-xmlserializer

修改

我认为你的代码看起来应该是这样的:

  [XmlIgnore]
    public string OtherXML;

    [XmlText]
    [XmlElement(ElementName = "OtherXML")]
    XmlCDataSection OtherXMLAsCdata
    {
        get
        {
            var dummy = new XmlDocument();
            return dummy.CreateCDataSection(OtherXML);
        }
        set
        {
            if (value == null)
            {
                OtherXML = null;
                return;
            }

            OtherXML = value.Value;
        }
    }