[英]C# serialize object to XML with element containing XML text without escaping
我搜索并尝试了一些属性,但没有一个适用于以下情况:
public class ObjSer
{
[XmlElement("Name")]
public string Name
{
get; set;
}
}
//Code to serialize
var obj = new ObjSer();
obj.Name = "<tag1>Value</tag1>";
var stringwriter = new System.IO.StringWriter();
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType());
serializer.Serialize(stringwriter, obj);
输出如下:
<ObjSer><Name><tag1>Value</tag1></Name></ObjSer>
但我需要输出为:
<ObjSer><Name><tag1>Value</tag1></Name></ObjSer>
方案2:在某些情况下,我需要设置:
obj.Name = "Value";
是否有我可以覆盖的属性或方法使之成为可能?
您不能使用默认的序列化器。 XmlSerializer在序列化期间对所有值进行编码。
如果要让成员保存xml值,则该值必须为XmlElement。 这是您如何实现的
public class ObjSer
{
[XmlElement("Name")]
public XmlElement Name
{
get; set;
}
}
var obj = new ObjSer();
// <-- load xml
var doc = new XmlDocument();
doc.LoadXml("<tag1>Value</tag1>");
obj.Name = doc.DocumentElement;
// --> assign the element
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType());
serializer.Serialize(Console.Out, obj);
输出:
<?xml version="1.0" encoding="IBM437"?>
<ObjSer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>
<tag1>Value</tag1>
</Name>
</ObjSer>
更新:
如果您要使用XElement而不是XmlElement,请参考以下示例
public class ObjSer
{
[XmlElement("Name")]
public XElement Name
{
get; set;
}
}
static void Main(string[] args)
{
//Code to serialize
var obj = new ObjSer();
obj.Name = XDocument.Parse("<tag1>Value</tag1>").Document.FirstNode as XElement;
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType());
serializer.Serialize(Console.Out, obj);
}
不,你不能。 这是xml序列化程序的自然和通常的行为。 序列化程序不必在XML字符串中进行处理。 因此,它按预期方式转义了xml。
反序列化时,应再次解码转义的字符串。
如果要在XML中动态添加元素,建议您使用Linq to XML
并且可以轻松创建tag1
或另一种元素。
我建议序列化为XDocument,然后将其转换为字符串,然后手动转义所需部分并将其写入文件。 我要说的是,这将使您头疼最少,不应超过几行代码。 如果需要,我可以在需要时提供一些代码示例。
我发现了另一种改变类型的方法
public class NameNode
{
public string tag1
{
get; set;
}
[XmlText]
public string Value
{
get; set;
}
}
public class ObjSer
{
[XmlElement("Name")]
public NameNode Name
{
get; set;
}
}
设置名称的值:
var obj = new ObjSer();
var valueToSet = "<tag1>Value</tag1>";
//or var valueToSet = "Value";
//With XML tag:
if (valueToSet.Contains("</"))
{
var doc = new XmlDocument();
doc.LoadXml(valueToSet);
obj.Name.tag1 = doc.InnerText;
}
else //Without XML Tags
{
obj.Name.Value = senderRecipient.Name;
}
该解决方案在两种情况下均适用,但有局限性。 它仅适用于预定义标签(例如tag1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.