2010-01-23 13 views
7

Próbuję zmienić nazwę root podczas wykonywania serializacji XML za pomocą C#.Jak zmienić nazwę katalogu głównego XML za pomocą Serializacji XML?

Zawsze bierze nazwę klasy, a nie nazwę, którą próbuję ustawić.

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


    } 
} 

Wynik

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

Nie zmienia go wildanimal. Nie jestem pewien, dlaczego. Mam to z samouczka.

Edit @ Marc

Dzięki. Teraz widzę, co robisz po prostu wydaje się tak dziwne, że trzeba zrobić opakowanie wokół niego. Mam jeszcze jedno pytanie, co się stanie, jeśli chcę utworzyć ten format, tak jak elementy zagnieżdżone. Czy będę musiał stworzyć nową klasę dla drugiej części i trzymać ją również w klasie owijania?

+0

Ponowna edycja; zależy to od tego, czy różdżką się jedną "inną" na "produkt", czy pojedynczą "innąElement" z utraconą częścią "produktu". W przypadku tego ostatniego: '[XmlArray]'/'[XmlArrayItem]' - inaczej tak: drugi typ. –

Odpowiedz

13

W twoim przykładzie, MyTest jest nie root; czy próbujesz zmienić nazwę tablicy? Napisałabym opakowanie:

[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

Domyślam się, że próbuję zmienić nazwę "ArrayOfMyTest" Myślałem, że MyTest jest rootem i to było coś, czego potrzebowała serializacja. Co mam zrobić z tym otokiem? Na przykład jak mam to teraz zrobić i serializować? – chobo2

+0

@ chobo2 - Dostarczyłem pełny przykład z 'Main',' SerializeToXML' oraz 'MyWrapper'. –

+0

Zobacz moją edycję .... – chobo2

Powiązane problemy