XmlSerializer-包含文本+xml+文本的节点

本文关键字:文本 节点 +xml+ XmlSerializer- 包含 | 更新日期: 2023-09-27 18:24:00

我有一个节点,它可以包含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>

我的代码将以文本形式输出为:

sometext <p>moretext</p>

我需要:

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

XmlSerializer-包含文本+xml+文本的节点

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

把你的课写成这样的

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

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

您必须使用CDATA,因为标签<>将使用CDATA或对字符串进行编码(可能是b64)来破坏XML结构

看看这里:

如何使用串行化串行化字符串

编辑:

我认为你的代码应该在之后看起来像这样

  [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;
        }
    }