C#对象为XML

Ami*_*hah 4 c# xml serialization xml-serialization

我正在创建一个需要将c#对象转换为XML的应用程序.

我正在使用XML Serializer类来实现这一点.这是代码片段:

public  class Anwer
{
    public int ID { get; set; }
    public string XML { get; set; }
    public Anwer(int ID, string XML)
    {
        this.ID = ID;
        this.XML = XML;
    }
    public Anwer() { }
}
Run Code Online (Sandbox Code Playgroud)

这是主要功能:

   string AnswerXML = @"<Answer>1<Answer>";
   List<Anwer> answerList = new List<Anwer>();
   answerList.Add(new Anwer(1,AnswerXML));
   AnswerXML = @"<Answer>2<Answer>";
   answerList.Add(new Anwer(2, AnswerXML));
   XmlSerializer x = new XmlSerializer(answerList.GetType());
   x.Serialize(Console.Out, answerList);
Run Code Online (Sandbox Code Playgroud)

输出是:

<?xml version="1.0" encoding="IBM437"?>
<ArrayOfAnwer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="h
ttp://www.w3.org/2001/XMLSchema">
  <Anwer>
    <ID>1</ID>
    <XML>&lt;Answer&gt;1&lt;Answer&gt;</XML>
  </Anwer>
  <Anwer>
    <ID>2</ID>
    <XML>&lt;Answer&gt;2&lt;Answer&gt;</XML>
  </Anwer>
</ArrayOfAnwer>
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,'<'和'>'被'<'和'>'取代; 怎么避免这个?我知道字符串替换是其中一种方式,但我不想使用它.

提前致谢.

Jon*_*eet 7

你基本上没有.这正确地序列化了对象 - XML序列化程序不希望在字符串中处理XML,因此它会适当地转义XML.

如果稍后反序列化XML,则将返回原始对象数据.

如果您尝试以自定义方式构建XML文档,我建议您不要使用XML序列化.如果您乐意明确地创建元素等,或者如果您真的想要在输出中直接包含任意字符串,请使用LINQ to XML XmlWriter.

如果您可以向我们提供有关您正在尝试做的更大图景的更多信息,我们可能会建议更好的替代方案 - 直接构建XML字符串几乎不是一个好主意.


Mar*_*ell 5

XmlSerializer不会相信你的元素是xml,除非你说服它,例如通过将该属性暴露为XmlDocument.否则,它(正确地,IMO)总是编码这样的值.例如:

using System;
using System.Xml;
using System.Xml.Serialization;
public class Anwer
{
    public int ID { get; set; }
    public XmlDocument XML { get; set; }
    public Anwer(int ID, string XML)
    {
        this.ID = ID;
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(XML);
        this.XML = doc;
    }
    public Anwer()
    { }
}
static class Program
{
    static void Main()
    {
        var answer = new Anwer(123, "<Answer>2</Answer>");
        var ser = new XmlSerializer(answer.GetType());
        ser.Serialize(Console.Out, answer);
    }
}
Run Code Online (Sandbox Code Playgroud)