2013-09-27 7 views
7

Próbuję serializować klasę, pisząc do pliku XML jako wiele fragmentów, tj. Zapisując każdy obiekt klasy jako pojedynczy fragment, bez nagłówek/root XML. Poniżej znajduje się przykładowy kod:.net XmlSerialize throws "WriteStartDocument nie może zostać wywołany na pisarzach utworzonych za pomocą ConformanceLevel.Fragment"

[Serializable] 
public class Test 
{ 
    public int X { get; set; } 
    public String Y { get; set; } 
    public String[] Z { get; set; } 

    public Test() 
    { 
    } 

    public Test(int x, String y, String[] z) 
    { 
     X = x; 
     Y = y; 
     Z = z; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test t1 = new Test(1, "t1", new[] { "a", "b" }); 
     Test t2 = new Test(2, "t2", new[] { "c", "d", "e" }); 

     XmlSerializer serializer = new XmlSerializer(typeof(Test)); 
     //using (StreamWriter writer = new StreamWriter(@"f:\test\test.xml")) 
     { 
      XmlWriter xmlWriter = XmlWriter.Create(@"f:\test\test.xml", 
                new XmlWriterSettings() 
                 {ConformanceLevel = ConformanceLevel.Fragment, 
                 OmitXmlDeclaration = true, 
                 Indent = true}); 
      serializer.Serialize(xmlWriter, t1); 
      serializer.Serialize(xmlWriter, t2); 
      xmlWriter.Close(); 
     } 
    } 
} 

W pierwszym zaproszeniu do serializacji, otrzymuję wyjątek:

WriteStartDocument cannot be called on writers created with ConformanceLevel.Fragment 

Co ja tu brakuje?

Odpowiedz

13

istnieje obejście tego problemu. Kiedy pisarz xml został użyty przed użyciem serializera, nagłówek nie zostanie zapisany. Poniższy działa, ale doda komentarz pusty znacznik na pierwszym wierszu pliku xml

ulepszony kod jak sugeruje Oleksa

static void Main(string[] args) 
    { 
     Test t1 = new Test(1, "t1", new[] { "a", "b" }); 
     Test t2 = new Test(2, "t2", new[] { "c", "d", "e" }); 

     XmlSerializer serializer = new XmlSerializer(typeof(Test)); 
     //using (StreamWriter writer = new StreamWriter(@"f:\test\test.xml")) 
     { 
      XmlWriter xmlWriter = XmlWriter.Create(@"test.xml", 
                new XmlWriterSettings() 
                { 
                 ConformanceLevel = ConformanceLevel.Fragment, 
                 OmitXmlDeclaration = false, 
                 Indent = true, 
                 NamespaceHandling = NamespaceHandling.OmitDuplicates 
                }); 
      xmlWriter.WriteWhitespace(""); 
      serializer.Serialize(xmlWriter, t1); 
      serializer.Serialize(xmlWriter, t2); 
      xmlWriter.Close(); 
     } 
    } 
+0

Wielki, który po prostu działa dobrze. Nie mam nic przeciwko pustemu komentarzowi w pliku – sppc42

+0

Należy pamiętać, że właściwość ['NamespaceHandling'] (http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.namespacehandling.aspx) istnieje w .NET 4.0 i nowszych. –

+3

Nie można nic napisać z 'xmlW.WriteWhitespace (" ")' – oleksa

Powiązane problemy