2010-01-23 5 views
7

J'essaye de changer le nom de racine en faisant la sérialisation XML avec C#.Comment changer le nom de racine XML avec XML Serialization?

Il prend toujours le nom de classe et pas le nom avec lequel je suis en train de le définir.

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


    } 
} 

Résultat

<?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> 

Il ne change pas à wildanimal. Je ne suis pas sûr pourquoi. Je l'ai eu d'un tutoriel.

Modifier @ Marc

Merci. Je vois maintenant ce que vous faites semble si bizarre que vous devez en faire un emballage. J'ai encore une question ce qui se passe si je voulais faire ce format

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

ainsi comme un éléments imbriqués. Est-ce que je devrais faire une nouvelle classe pour la deuxième partie et coller cela dans la classe d'emballage aussi?

+0

Re votre édition; cela dépend de si vous allez un 'anotherElement' par' product', ou un seul 'anotherElement' avec des éléments' product' perdus. Pour le dernier: '[XmlArray]'/'[XmlArrayItem]' - sinon oui: un second type. –

Répondre

13

Dans votre exemple, MyTest est et non la racine; essayez-vous de renommer le tableau? Je voudrais écrire un wrapper:

[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

Je suppose que j'essaie de changer le nom de "ArrayOfMyTest" Je pensais que MyTest était la racine et que c'était juste quelque chose dont la sérialisation avait besoin. Alors qu'est-ce que je fais avec ce wrapper? Comment est-ce que je le prends maintenant et le sérialise? – chobo2

+0

@ chobo2 - J'ai fourni un exemple complet avec 'Main',' SerializeToXML' et 'MyWrapper'. –

+0

Voir ma modification .... – chobo2

Questions connexes