2010-11-27 9 views
1

J'ai un modèle que je voudrais sérialiser en un xml avec des propriétés spécifiques.ASP.NET MVC: C# personnalisé sérialiser une liste d'objets en xml

Modèle:

public class MyClassModel 
{ 
    public int Id { get; set; } 
    public DateTime updated { get; set; } 
} 

Le code dans l'action du contrôleur:

IList<MyClassModel> objects = getStuff(); 
return new XmlResult(jaPropEstates); //Asp.net mvc class that is inherited from ActionResult 

classe XMLRésultat

public class XmlResult : ActionResult 
{ 
    private object objectToSerialize; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="XmlResult"/> class. 
    /// </summary> 
    /// <param name="objectToSerialize">The object to serialize to XML.</param> 
    public XmlResult(object objectToSerialize) 
    { 
     this.objectToSerialize = objectToSerialize; 
    } 

    /// <summary> 
    /// Gets the object to be serialized to XML. 
    /// </summary> 
    public object ObjectToSerialize 
    { 
     get { return this.objectToSerialize; } 
    } 

    /// <summary> 
    /// Serialises the object that was passed into the constructor to XML and writes the corresponding XML to the result stream. 
    /// </summary> 
    /// <param name="context">The controller context for the current request.</param> 
    public override void ExecuteResult(ControllerContext context) 
    { 
     if (this.objectToSerialize != null) 
     { 
      context.HttpContext.Response.Clear(); 
      var xs = new System.Xml.Serialization.XmlSerializer(this.objectToSerialize.GetType()); 
      context.HttpContext.Response.ContentType = "text/xml"; 
      xs.Serialize(context.HttpContext.Response.Output, this.objectToSerialize); 
     } 
    } 
} 

La sortie:

<ArrayOfMyClassModel> 
    <MyClassModel> 
     <Id>0</Id> 
     <updated>0001-01-01T00:00:00</updated> 
    </MyClassModel> 
    <MyClassModel> 
     <Id>2</Id> 
     <updated>0001-01-01T00:00:00</updated> 
    </MyClassModel> 

Je veux que ce soit comme ceci:

<?xml version="1.0" encoding="utf-8" ?> <!-- I want this --> 
<listings xmlns="listings-schema"> <!-- I want ArrayOfMyClassModel to be renamed to this --> 
    <property> <!-- I want MyClassModel to be renamed to property --> 
     <Id>2</Id> 
     <updated>0001-01-01T00:00:00</updated> 
    </property> 
</listings> 

Notez la différence comme commenté. Comment donner des noms personnalisés à mes éléments?

Répondre

1

Je suppose que vous avez des ensembles de données plus volumineux en termes de volume et de complexité.

La première approche qui me vient à l'esprit est d'obtenir votre résultat dans un objet XmlDocument puis de le transformer par rapport à une transformation XSL.

OU System.Xml.Serialization.XmlSerializer est un autre angle d'approche.

Voir un exemple here

+0

La seconde ne montre pas comment renommer les nœuds du nom de la propriété d'origine. –

0

Votre classe s'appelle "MyClassModel". Si vous voulez que votre élément xml soit appelé "propriété" à la place, renommez votre classe en "propriété". Cependant, vous violeriez les conventions d'appellation courantes en utilisant un étui à chameau au lieu d'un étui pascal pour votre classe.

+0

Il n'y a donc aucun moyen de mettre un attribut dessus donc son renommé dans le xml et ne pas renommer la classe entière? Je dois suivre un schéma qui m'a été donné pour exposer les données. –

+0

Je pense qu'il existe un attribut appelé XmlType que vous pouvez mettre dans la classe pour le renommer dans le fichier xml. Je suis habitué à nommer ma classe et mes propriétés pour qu'elles soient les mêmes que les noms xml, mais l'utilisation de l'attribut est également acceptable. –