.NET XML序列化程序和对象属性中的XHTML字符串

时间:2019-05-11 19:24:34

标签: c# .net xml xhtml xml-serialization

我上课

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.7.3081.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://test/v1")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://test/v1", IsNullable=false)]
public partial class Data
{
    ...
    public object Comment { get; set; }
    ...
}

注释属性的类型为object,因为在xml模式中它被声明为类型any。声明为any允许文本和xhtml数据。我无法更改架构-它与国际标准有关。

单行内容(字符串):

<Comment>This is a single line text</Comment>

多行内容(xhtml):

<Comment>
   <div xmlns="http://www.w3.org/1999/xhtml">This is text<br />with line breaks<br />multiple times<div>
</Comment>

XmlSerializer不允许我将XmlElement插入自动生成的Data类的object Comment属性中。我还尝试过为XHtml创建自定义IXmlSerializer实现,但是随后需要将XSD生成的Comment属性声明为该确切类型(而不是对象)。

我要在Comment属性上设置的自定义XHtml类型如下所示:

[XmlRoot]
public class XHtmlText : IXmlSerializable
{
    [XmlIgnore]
    public string Content { get; set; }

    public XmlSchema GetSchema() => null;

    public void ReadXml(XmlReader reader) { } // Only used for serializing to XML

    public void WriteXml(XmlWriter writer)
    {
        if (Content.IsEmpty()) return;

        writer.WriteStartElement("div", "http://www.w3.org/1999/xhtml");
        var lines = Content.Split('\n');
        for (var i = 0; i < lines.Length; i++)
        {
            var line = lines[i];
            writer.WriteRaw(line);
            if (i < lines.Length - 1) writer.WriteRaw("<br />");
        }
        writer.WriteFullEndElement();
    }
}

XmlSerializer的异常:

  

InvalidOperationException:可能不使用类型Lib.Xml.XHtmlText   在这种情况下。要将Lib.Xml.XHtmlText用作参数,请返回类型,   或类或结构的成员,参数,返回类型或成员   必须声明为Lib.Xml.XHtmlText类型(不能是对象)。   Lib.Xml.XHtmlText类型的对象不能在未类型化的对象中使用   集合,例如ArrayLists

序列化代码:

    var data = new Lib.Xml.Data { Content = "test\ntest\ntest\n" };

    var settings = new XmlWriterSettings()
    {
        NamespaceHandling = NamespaceHandling.OmitDuplicates,
        Indent = false,
        OmitXmlDeclaration = omitDeclaration,
    };

    using (var stream = new MemoryStream())
    using (var xmlWriter = XmlWriter.Create(stream, settings))
    {
        var serializer = new XmlSerializer(data.GetType(), new[] { typeof(Lib.Xml.XHtmlText) });
        serializer.Serialize(xmlWriter, data);
        return stream.ToArray();
    }

1 个答案:

答案 0 :(得分:0)

好像我找到了解决方案。

我无法将注释设置为XmlElement的实例

data.Comment = commentAsXhtmlXmlElement;

但是我可以(以某种方式)分配XmlNode数组

data.Comment = new XmlNode[] { commentAsXhtmlXmlElement };

当我反序列化数据POCO的入站xml实例时发现。

奇怪。