2010-01-23 19 views
7

Estoy tratando de cambiar el nombre de raíz al hacer la serialización XML con C#.¿Cómo cambiar el nombre raíz XML con Serialización XML?

Siempre toma el nombre de la clase y no el nombre con el que intento establecerlo.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Serialization; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 


      MyTest test = new MyTest(); 
      test.Test = "gog"; 

      List<MyTest> testList = new List<MyTest>() 
      {  
       test 
      }; 

      SerializeToXML(testList); 
     } 

     static public void SerializeToXML(List<MyTest> list) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(List<MyTest>)); 
      TextWriter textWriter = new StreamWriter(@"C:\New folder\test.xml"); 
      serializer.Serialize(textWriter, list); 
      textWriter.Close(); 
     } 
    } 


} 





using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Serialization; 

namespace ConsoleApplication1 
{ 

    [XmlRootAttribute(ElementName = "WildAnimal", IsNullable = false)] 
    public class MyTest 
    { 
     [XmlElement("Test")] 
     public string Test { get; set; } 


    } 
} 

Resultado

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfMyTest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MyTest> 
    <Test>gog</Test> 
    </MyTest> 
</ArrayOfMyTest> 

No cambia a wildanimal. No estoy seguro por qué. Lo obtuve de un tutorial.

Editar @ Marc

Gracias. Ahora veo que lo que haces parece tan extraño que tienes que hacer un rodeo al respecto. Tengo una pregunta más qué sucede si quisiera hacer este formato

<root> 
    <element> 
     <name></name> 
    </element> 
    <anotherElement> 
     <product></product> 
    </anotherElement> 
</root> 

así como un elementos anidados. ¿Tendría que hacer una nueva clase para la segunda parte y poner eso en la clase contenedora también?

+0

Re la edición; depende de si cambia un 'otro elemento' por' producto', o un solo 'otro elemento' con pérdida de elementos' producto'. Para este último: '[XmlArray]'/'[XmlArrayItem]' - de lo contrario sí: un segundo tipo. –

Respuesta

13

En su ejemplo, MyTest es no la raíz; ¿Estás tratando de cambiar el nombre de la matriz? Escribiría una envoltura:

[XmlRoot("NameOfRootElement")] 
public class MyWrapper { 
    private List<MyTest> items = new List<MyTest>(); 
    [XmlElement("NameOfChildElement")] 
    public List<MyTest> Items { get { return items; } } 
} 

static void Main() { 
    MyTest test = new MyTest(); 
    test.Test = "gog"; 

    MyWrapper wrapper = new MyWrapper { 
     Items = { test } 
    }; 
    SerializeToXML(wrapper); 
} 

static public void SerializeToXML(MyWrapper list) { 
    XmlSerializer serializer = new XmlSerializer(typeof(MyWrapper)); 
    using (TextWriter textWriter = new StreamWriter(@"test.xml")) { 
     serializer.Serialize(textWriter, list); 
     textWriter.Close(); 
    } 
} 
+0

Supongo que estoy tratando de cambiar el nombre de "ArrayOfMyTest". Pensé que MyTest era la raíz y que era algo que la serialización necesitaba. Entonces, ¿qué hago con este envoltorio? ¿Cómo puedo tomarlo ahora y serializarlo? – chobo2

+0

@ chobo2 - He proporcionado un ejemplo completo con 'Main',' SerializeToXML' y 'MyWrapper'. –

+0

Ver mi edición ... – chobo2

Cuestiones relacionadas