C#对象为XML

我正在创建一个需要将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() { } } 

这是主要function:

  string AnswerXML = @"1"; List answerList = new List(); answerList.Add(new Anwer(1,AnswerXML)); AnswerXML = @"2"; answerList.Add(new Anwer(2, AnswerXML)); XmlSerializer x = new XmlSerializer(answerList.GetType()); x.Serialize(Console.Out, answerList); 

输出是:

    1 <Answer>1<Answer>   2 <Answer>2<Answer>   

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

提前致谢。

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

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

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

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

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, "2"); var ser = new XmlSerializer(answer.GetType()); ser.Serialize(Console.Out, answer); } } 

我正在创建一个需要将c#对象转换为XML的应用程序。 我正在使用XML Serializer类来实现这一点

如果您正在使用XML Serializer来完成工作,那么为什么在“XML”字段中插入手工编码的XML? 看起来你想要更像这样的东西(使用你的类名,虽然它看起来像拼写错误):

 public class Anwer { public int ID { get; set; } public int Answer { get; set; } } .. List answerList = new List() { new Anwer { ID=1, Answer=2 }, new Anwer { ID=2, Answer=3 }, }; XmlSerializer x = new XmlSerializer(answerList.GetType()); x.Serialize(Console.Out, answerList); ..   1 2  ... 

或者,如果您确实希望/需要将Answer元素嵌套在XML元素中,出于某种原因,您可以更改Anwer对象以反映该结构(如Oleg Kalenchuk建议的那样),或者自己生成XML而不是使用序列化器:

 XElement xml = new XElement("AnwerList", from anwer in anwerList select new XElement("Anwer", new XElement("ID", anwer.ID), new XElement("XML", new XElement("Answer", anwer.Answer) ) ) ); Console.Out.WriteLine(xml);   1  2   ... 

无论如何,我更喜欢后者,因为它可以让你获得更多的控制权。

您将一个包含<和>符号的字符串分配给XML元素,因此很明显,序列化程序会将<和>替换为实体引用。 即使您在反序列化XML时在文本中获得>,您也会在文本中获得>。

  1. 使用一个整数“Answer”成员创建一个新类AnswerXML
  2. 将XML成员的类型更改为AnswerXML而不是string

因为’<'和'>‘是用于xml结构本身的字符,所以它们会自动进行htmlencoded。 当您在应用中阅读它并将其反序列化时, '<''> ‘应该转换回’<'和'>‘。

如果您的目标不是,请使用htmldecodefunction。

如果这没有帮助,只需告诉你想要用xml-data做什么。