C#对象为XML

时间:2010-12-17 07:16:05

标签: 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() { }
}

这是主要功能:

   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);

输出结果为:

<?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>

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

提前致谢。

6 个答案:

答案 0 :(得分:7)

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

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

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

如果您可以向我们提供有关您正在尝试做的更大范围的更多信息,我们可能会提出更好的选择 - 直接构建XML字符串几乎不是一个好主意。

答案 1 :(得分: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);
    }
}

答案 2 :(得分:1)

  

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

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

public class Anwer
{
    public int ID { get; set; }
    public int Answer { get; set; }
}

..

List<Anwer> answerList = new List<Anwer>() {
   new Anwer { ID=1, Answer=2 },
   new Anwer { ID=2, Answer=3 },
};
XmlSerializer x = new XmlSerializer(answerList.GetType());
x.Serialize(Console.Out, answerList);

..

<ArrayOfAnwer ...>
  <Anwer>
    <ID>1</ID>
    <Answer>2</Answer>
  </Anwer>
  ...

或者,如果您确实希望/需要将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);

<AnwerList>
  <Anwer>
    <ID>1</ID>
    <XML>
      <Answer>2</Answer>
    </XML>
  </Anwer>
  ...

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

答案 3 :(得分:0)

您正在指定一个包含&lt;的字符串。和&gt;签署XML元素,因此显然teh序列化器将替换&lt;和&gt;与实体引用。即使你得到&gt;在反序列化XML的文本中,您将获得&gt;在你的文字中。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

因为'&lt;'和'&gt;'是用于xml结构本身的字符,它们是自动htmlencoded。当您在应用中阅读并反序列化时,'&lt;''&gt;'应转换回'&lt;'和'&gt;'。

如果您的目标不是,请使用htmldecode功能。

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