C#对象转换为XML

4

我正在创建一个应用程序,需要将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>

在上面的代码中,'<'和'>'会被替换为'<'和'&gt;'。如何避免这种情况?我知道字符串替换是其中一种方法,但我不想使用它。提前致谢。

2
而问题是...... - Adriaan Stander
它们必须符合定义... - Mitch Wheat
你知道你输入的那个 xml 并不是 真正的 xml 吗? - Marc Gravell
将您所有的 XML 存储在字符串中!太棒了!为什么我没想到呢? - jb.
6个回答

7
基本上不需要。这是正确序列化对象的方式- XML序列化程序不想处理在字符串中混淆事情的XML,因此它会适当地转义XML。如果稍后反序列化XML,则会返回原始对象数据。如果您尝试以自定义方式构建XML文档,则建议您首先不要使用XML序列化。如果您愿意明确创建元素等,则使用LINQ to XML,或者如果您真的非常想直接将任意字符串包含在输出中,则使用XmlWriter。如果您可以向我们提供有关您正在尝试执行的更大图片的更多信息,则我们可能能够建议更好的替代方法-直接构建XML字符串几乎永远不是一个好主意。

嗨Jon,感谢回复。基本上这是一个客户端服务器应用程序,客户端发送的响应以xml字符串的形式发送,我将所有响应存储到类型为Answer的列表中,然后进一步发送到另一个服务器进行记录。 - Amit Shah
@Amit:好的,像你现在这样将它序列化,然后稍后反序列化,你就能得到相同的数据。问题出在哪里? - Jon Skeet

5

XmlSerializer 不会相信一个元素是 xml,除非你说服它,例如通过将该属性公开为 XmlDocument。否则,它(在我看来)总是对这些值进行编码。例如:

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

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元素中,您可以修改答案对象以反映该结构(如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>
  ...

我更倾向于后者,因为它可以给你更多的控制。


0

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


0
  1. 创建一个名为AnswerXML的新类,其中包含一个整数成员"Answer"
  2. 将XML成员的类型更改为AnswerXML而不是字符串

0
因为'<'和'>'是用于xml结构本身的字符,所以它们会自动进行html编码。当你在应用程序中读取并反序列化它时,'&lt;'和'&gt;'应该转换回'<'和'>'。
如果您的目标不同,请使用htmldecode功能。
如果这不能帮助您,请告诉我们您要对xml数据做什么。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接