2011-11-09 25 views
20

Sto serializzando un oggetto usando C#. Sto ottenendo risultato in questo formato dato muggitoserializzazione xml - rimuovi namespace

<?xml version="1.0"?> 
    <Users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <Users> 
     <User Id="11005477969327" CreateDate="06/03/2011" LastSendDate="1/1/0001" /> 
     <User Id="11034688201594" CreateDate="04/22/2012" LastSendDate="1/1/0001" /> 
     <Users 
    </User> 

Ma voglio risultato in questo formato.

<?xml version="1.0"?> 
<Users> 
    <User Id="11005477969327" SendDate="1/1/0001" NextSendDate="2/7/2012 11:13:30 AM" /> 
    <User Id="11034688201594" SendDate="1/1/0001" NextSendDate="2/7/2012 11:13:30 AM" /> 

</Users> 

qui il mio codice

public class Users 
    { 
     [XmlArray("Users")] 
     public List<User> ListData { get; set; } 

     public string GetXML() 
     { 
      System.IO.MemoryStream ms = new System.IO.MemoryStream(); 

      XmlSerializer sr = new XmlSerializer(typeof(Users)); 
      sr.Serialize(ms, this); 

      ms.Position = 0; 
      return System.Text.Encoding.UTF8.GetString(ms.ToArray()); 
     } 
    } 

    public class User 
    { 
     [XmlAttribute("Id")] 
     public Int64 UserId { get; set; } 

     [XmlAttribute("CreateDate")] 
     public string CreateDate { get; set; } 

     [XmlAttribute("LastSendDate")] 
     public string LastSendDate { get; set; } 


    } 
+1

forse questi vi aiuterà http://stackoverflow.com/questions/625927/omitting-all-xsi-and-xsd-namespaces-when -serializing-an-oggetto-in-net http://stackoverflow.com/questions/6037948/remove-namespaces-during-xml-serialization – Mithir

+0

Possibile duplicato di [Tralasciando tutti gli spazi dei nomi XSI e XSD durante la serializzazione di un OB ject in .NET?] (http://stackoverflow.com/questions/625927/omitting-all-xsi-and-xsd-namespaces-when-serializing-an-object-in-net) –

risposta

50

Si dovrebbe sostituire semplicemente [XmlArray("Users")] con [XmlElement("User")]

Questo attributo dire serializzatore, che si desidera memorizzare tutti quegli elementi utente in particolare nodo "Users", se lo sostituisci con XmlElement, serialzer memorizzerà tutti quegli utenti in linea (proprio sotto il primo tag Users) proprio come ti piace.

Come per gli spazi dei nomi xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema". Vengono aggiunti automaticamente, ma sono innocui, poiché tutti i tuoi elementi si trovano nello spazio dei nomi predefinito. Puoi aggiungere seguente codice al XmlSerializer chiamata al fine di rimuovere quelli:

var xns = new XmlSerializerNamespaces(); 
var serializer = new XmlSerializer(users.GetType()); 
xns.Add(string.Empty, string.Empty); 
//... 
serializer.Serialize(stream, users, xns); 
+1

Potresti anche trovare XmlSettings utile per il layout del tuo file XML: 'XmlWriter writer; XmlSettings.Indent = true; XmlSettings.NewLineOnAttributes = true; \t scrittore = XmlWriter.Create (Path.Combine (strOutputDir, strXmlFileName), XmlSettings); '\t \t \t \t \t \t serializer.Serialize (scrittore, VcdMsg); \t \t \t \t \t \t writer.Close(); – MoonKnight

+1

+1: proprio quello di cui avevo bisogno per lo stesso problema (e una buona spiegazione). @Pankaj: Perché questo non è contrassegnato come la risposta corretta? –

+0

perfetto, grazie Vlad! – inside

-5

soluzione Quickie - convertire in stringa e quindi rimuovere quindi - Utilizza un clic sul pulsante per avviare l'esecuzione.

Imports System.IO 
Public Class Form1 
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    Dim mydoc As XElement = XElement.Load("C:\Users\Documents\myfile.XML") 
    Dim y As String = mydoc.ToString 
    Dim z As String = mydoc.Name.Namespace.ToString 
    Dim getrid As String = " xmlns=" & Chr(34) & z & Chr(34) 
    y = Replace(y, getrid, "") 
    Dim tr As TextReader = New StringReader(y) 
    Dim newdoc As XElement = XElement.Load(tr) 
    tr.Close() 
    Debug.Print(newdoc.ToString) 
End Sub 
End Class 
+0

Spiegazione, per favore? – vonbrand

3

Si dovrebbe scrivere:

XmlSerializer sr = new XmlSerializer(typeof(Users)); 
XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add("",""); 
sr.Serialize(ms, this, ns);