XmlSerializer - node containing text + xml + text

2020-02-07 05:29发布

I have a node that can contain either text or xml, text + xml or text + xml + text. The first two cases i have solved using

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

However, the last case where there is text after the xml I cant find a solution for.

XML

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

my code will give output in Text as:

sometext <p>moretext</p>

I need:

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

2条回答
Deceive 欺骗
2楼-- · 2020-02-07 06:05

you have to use CDATA - because the tags <> will break the XML-Structure use CDATA or encode your string (maybe b64)

take a look here:

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

EDIT:

I think your code should look something like this after:

  [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;
        }
    }
查看更多
Rolldiameter
3楼-- · 2020-02-07 06:20

What you want is called mixed content and is supported in the XmlSerializer.

write your class like this

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

and put all the elements in the same object array

查看更多
登录 后发表回答