繁体   English   中英

C#使用不包含转义符的包含XML文本的元素将对象序列化为XML

[英]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>&lt;tag1&gt;Value&lt;/tag1&gt;</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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM