C # объект в XML - PullRequest
       31

C # объект в XML

4 голосов
/ 17 декабря 2010

Я создаю приложение, которое требует преобразования объекта 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>

В приведенном выше коде '<'и '>' заменяются на '<' и '>';Как этого избежать?Я знаю, что замена строк - один из способов, но я не хочу его использовать.

Заранее спасибо.

Ответы [ 6 ]

7 голосов
/ 17 декабря 2010

В принципе, нет. Это правильно, сериализация объекта - сериализатор XML не хочет иметь дело с XML внутри строк, что портит все, поэтому он должным образом экранирует XML.

Если вы десериализируете XML позже, вы вернетесь к исходным данным объекта.

Если вы пытаетесь создать XML-документ нестандартным способом, я предлагаю вам не использовать сериализацию XML для начала. Либо используйте LINQ to XML, если вы счастливы создавать элементы и т. Д. Явно, либо если действительно, действительно хотите включить произвольные строки непосредственно в ваш вывод, используйте XmlWriter.

Если бы вы могли дать нам больше информации о более широкой картине того, что вы пытаетесь сделать, мы могли бы предложить лучшие альтернативы - непосредственное построение строк XML почти никогда не является хорошей идеей.

5 голосов
/ 17 декабря 2010

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);
    }
}
1 голос
/ 17 декабря 2010

Я создаю приложение, которое требует преобразования объекта 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, чтобы он отражал эту структуру (как предлагает Олег Каленчук), или генерировать 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 голосов
/ 17 декабря 2010

Поскольку «<» и «>» являются символами, используемыми для самой xml-структуры, они автоматически htmlencoded.Когда вы читаете его обратно в своем приложении и десериализуете, '&lt;' и '&gt; 'должны быть преобразованы обратно в' <'и'> '.

Если ваша цель в противном случае, используйте функциональность htmldecode.

Если это не поможет, просто скажите, что именно вы хотите сделать с xml-данными.

0 голосов
/ 17 декабря 2010
  1. Создайте новый класс AnswerXML с одним целочисленным членом «Answer»
  2. Измените тип элемента XML на AnswerXML вместо строки
0 голосов
/ 17 декабря 2010

Вы присваиваете строку, содержащую знак <и>, элементу XML, поэтому очевидно, что сериализатор заменит <и> ссылками на сущности.Даже если вы получаете> в тексте при десериализации XML, вы получите> в своем тексте.

...