提问人:Frode 提问时间:5/12/2019 更新时间:5/12/2019 访问量:236
对象属性中的 .NET XML 序列化程序和 XHTML 字符串
.NET XML serializer and XHTML string in object property
问:
我有一个班级
[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; }
...
}
Comment 属性的类型是因为它在 xml 架构中声明为 type。它被声明为 any 以允许文本和 xhtml 数据。我无法更改架构 - 它与国际标准相关。object
any
单行内容(字符串):
<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>
不允许我将 插入到自动生成的 Data 类的属性中。我还尝试为 XHtml 创建自定义实现,但随后需要将 XSD 生成的 Comment 属性声明为该确切类型(而不是对象)。XmlSerializer
XmlElement
object Comment
IXmlSerializer
我尝试在 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();
}
答:
0赞
Frode
5/12/2019
#1
看来我已经找到了解决方案。
我无法将注释设置为 XmlElement 的实例
data.Comment = commentAsXhtmlXmlElement;
但是我可以(以某种方式)分配一个XmlNode数组
data.Comment = new XmlNode[] { commentAsXhtmlXmlElement };
当我反序列化数据 POCO 的入站 xml 实例时发现的。
奇怪。
评论