4 Stimmen

C# Objekt zu XML

Ich erstelle eine Anwendung, die erfordert, dass ein C#-Objekt in XML konvertiert wird.

Ich benutze die XML Serializer-Klasse, um dies zu erreichen. Hier ist der Codeausschnitt:

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

Hier ist die Hauptfunktion:

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

Die Ausgabe ist:

    1
    <Answer>1<Answer>

    2
    <Answer>2<Answer>

In dem obigen Code werden '<' und '>' durch '<' und '>' ersetzt; Wie kann man das vermeiden? Ich weiß, dass string replace eine Möglichkeit ist, aber ich möchte es nicht verwenden.

Vielen Dank im Voraus.

7voto

Jon Skeet Punkte 1325502

Sie tun es im Grunde genommen nicht. Das Serialisieren des Objekts erfolgt korrekt - der XML-Serializer möchte nicht mit XML innerhalb von Zeichenfolgen umgehen, die Dinge durcheinander bringen, daher maskiert er das XML entsprechend.

Wenn Sie das XML später deserialisieren, erhalten Sie die ursprünglichen Objektdaten zurück.

Wenn Sie versuchen, ein XML-Dokument auf benutzerdefinierte Weise aufzubauen, schlage ich vor, XML-Serialisierung überhaupt nicht zu verwenden. Verwenden Sie entweder LINQ to XML, wenn Sie Elemente usw. explizit erstellen möchten, oder wenn Sie wirklich, wirklich beliebige Zeichenfolgen direkt in Ihrer Ausgabe verwenden möchten, verwenden Sie XmlWriter.

Wenn Sie uns mehr Informationen über das Gesamtbild dessen geben könnten, was Sie versuchen zu tun, könnten wir Ihnen bessere Alternativen vorschlagen - das direkte Erstellen von XML-Zeichenfolgen ist fast nie eine gute Idee.

5voto

Marc Gravell Punkte 970173

XmlSerializer glaubt nicht, dass ein Element xml ist, es sei denn, Sie überzeugen es, zum Beispiel indem Sie diese Eigenschaft als XmlDocument freigeben. Andernfalls codiert es (meiner Meinung nach korrekt) immer solche Werte. Zum Beispiel:

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

1voto

Mud Punkte 26752

Ich erstelle eine Anwendung, die erfordert, dass ein c#-Objekt in XML konvertiert wird. Ich verwende die XML-Serializer-Klasse, um dies zu erreichen

Wenn Sie den XML-Serializer verwenden, um die Arbeit zu erledigen, warum dann das "XML"-Feld, in dem Sie von Hand codiertes XML einfügen? Es scheint, als ob Sie eher etwas wie dies möchten (unter Verwendung Ihres Klassennamens, obwohl es wie ein Rechtschreibfehler aussieht):

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

  ...

Oder wenn Sie tatsächlich möchten/brauchen, dass das Answer-Element aus irgendeinem Grund in einem XML-Element verschachtelt ist, können Sie Ihr Anwer-Objekt ändern, um diese Struktur widerzuspiegeln (wie Oleg Kalenchuk vorschlägt), oder generieren Sie das XML selbst anstatt den Serializer zu verwenden:

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

  ...

Ich bevorzuge letzteres sowieso, weil es Ihnen mehr Kontrolle gibt.

0voto

Raj Punkte 1726

Sie weisen dem XML-Element einen String zu, der das < und > Zeichen enthält, sodass es offensichtlich ist, dass der Serialisierer das < und > durch Entity-Referenzen ersetzen würde. Selbst wenn Sie > im Text erhalten, wenn Sie das XML deserialisieren, erhalten Sie das > in Ihrem Text.

0voto

Oleg Kalenchuk Punkte 517
  1. Erstellen Sie eine neue Klasse AnswerXML mit einem Integer-"Antwort" -Member
  2. Ändern Sie den Typ des XML-Mitglieds auf AnswerXML anstelle von String

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X