问题
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
回答1:
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
回答2:
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;
}
}
来源:https://stackoverflow.com/questions/25995609/xmlserializer-node-containing-text-xml-text