2011-11-09 41 views
20

Estoy serializando un objeto usando C#. Estoy obteniendo el resultado en este formato dado abajoserialización xml - eliminar el espacio de nombres

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

Pero quiero obtener el resultado en este 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> 

aquí mi código

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

tal vez estos le ayudarán http://stackoverflow.com/questions/625927/omitting-all-xsi-and-xsd-namespaces-when -serializing-un-objeto-en-net http://stackoverflow.com/questions/6037948/remove-namespaces-during-xml-serialization – Mithir

+0

duplicado posible de [omisión de todos los espacios de nombres xsi y xsd al serializar un ob ject en .NET?] (http://stackoverflow.com/questions/625927/omitting-all-xsi-and-xsd-namespaces-when-serializing-an-object-in-net) –

Respuesta

50

Usted simplemente debe sustituir [XmlArray("Users")] con [XmlElement("User")]

Este atributo decir serializador, que desea almacenar todos los elementos de usuario bajo particular, el nodo "Usuarios", si lo reemplaza con XmlElement, serialzer almacenará todos esos usuarios en línea (justo debajo de la primera etiqueta de Usuarios) tal como lo prefiera.

En cuanto a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" espacios de nombres. Se agregan automáticamente, pero son inofensivos, ya que todos sus elementos están en el espacio de nombres predeterminado. Puede añadir código siguiente a su llamada XmlSerializer el fin de eliminar los:

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

También puede encontrar el XmlSettings útil para el diseño de su archivo XML: 'XmlWriter writer; XmlSettings.Indent = true; XmlSettings.NewLineOnAttributes = true; \t escritor = XmlWriter.Create (Path.Combine (strOutputDir, strXmlFileName), XmlSettings); '\t \t \t \t \t \t serializer.Serialize (escritor, VcdMsg); \t \t \t \t \t \t writer.Close(); – MoonKnight

+1

+1: Justo lo que necesitaba para el mismo problema (y una buena explicación). @Pankaj: ¿Por qué esto no está marcado como la respuesta correcta? –

+0

perfecto, gracias Vlad! – inside

-5

solución Quickie - convierte a cadena y luego eliminar de este modo - Utiliza un clic de botón para comenzar la ejecución.

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

Explicación, por favor? – vonbrand

3

Usted debe escribir:

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