【问题标题】:C# object to XMLC# 对象到 XML
【发布时间】:2010-12-17 07:16:04
【问题描述】:

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

我正在使用 XML Serializer 类来实现这一点。这是代码sn-p:

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>

在上面的代码中,'' 被替换为 '

提前致谢。

【问题讨论】:

  • Aaaaaannnnddddd 问题是......
  • 它们必须按照定义...
  • 你知道你给它的xml 不是 xml,顺便说一句?
  • 将所有 xml 保存在字符串中!杰出的!我怎么没想到呢?

标签: c# xml serialization xml-serialization


【解决方案1】:

基本上你不会。这是正确序列化对象 - XML 序列化程序不想处理字符串中的 XML 搞砸了,所以它适当地转义了 XML。

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

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

如果您可以向我们提供有关您正在尝试做的大局的更多信息,我们或许可以提出更好的替代方案 - 直接构建 XML 字符串几乎从来都不是一个好主意。

【讨论】:

  • 嗨乔恩。感谢您的回复。基本上这是一个客户端服务器应用程序,并且从客户端发送的响应是 xml 字符串的形式,我将所有响应存储到一个答案类型的列表中,我还想要另一个服务器进行记录。
  • @Amit:很好,所以像你一样序列化它,然后你可以反序列化它,你将拥有相同的数据。有什么问题?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    如果您使用 XML 序列化器来完成这项工作,那么为什么要在“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>
      ...
    

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:
        1. 使用一个整数“Answer”成员创建一个新类 AnswerXML
        2. 将 XML 成员的类型更改为 AnswerXML 而不是字符串

        【讨论】:

          【解决方案6】:

          因为 '' 是用于 xml 结构本身的字符,所以它们会自动进行 htmlencoded。当你在你的应用程序中读回它并反序列化它时,'&amp;lt;''&amp;gt;' 应该被转换回 ''。

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-11-15
            • 2012-05-15
            • 2023-03-04
            • 2010-09-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-24
            相关资源
            最近更新 更多