2011-11-09 31 views
20

Tôi đang sắp xếp một đối tượng bằng cách sử dụng C#. Tôi nhận được kết quả theo định dạng này được cung cấp dưới đâyxml serialization - xóa không gian tên

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

Nhưng tôi muốn có định dạng này.

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

đây mã của tôi

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

có lẽ chúng sẽ giúp http://stackoverflow.com/questions/625927/omitting-all-xsi-and-xsd-namespaces-when -serializing-an-object-in-net http://stackoverflow.com/questions/6037948/remove-namespaces-during-xml-serialization – Mithir

+0

Có thể trùng lặp của [Bỏ qua tất cả xsi và xsd không gian tên khi tuần tự hóa một ob ject in .NET?] (http://stackoverflow.com/questions/625927/omitting-all-xsi-and-xsd-namespaces-when-serializing-an-object-in-net) –

Trả lời

50

Bạn chỉ nên thay thế [XmlArray("Users")] với [XmlElement("User")]

Thuộc tính này nói serializer, mà bạn muốn để lưu trữ tất cả những mặt hàng tài khoản dưới nút đặc biệt "Người dùng", nếu bạn thay thế nó bằng XmlElement, bộ nối tiếp sẽ lưu trữ tất cả những người dùng đó trực tiếp (ngay trong thẻ Người dùng đầu tiên) giống như bạn thích.

Đối với xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" không gian tên. Chúng được thêm tự động, nhưng chúng vô hại, vì tất cả các phần tử của bạn nằm trong không gian tên mặc định. Bạn có thể thêm mã sau vào XmlSerializer cuộc gọi của bạn để loại bỏ những:

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

Bạn cũng có thể tìm thấy XmlSettings hữu ích cho việc bố trí tệp XML của bạn: 'XmlWriter writer; XmlSettings.Indent = true; XmlSettings.NewLineOnAttributes = true; \t nhà văn = XmlWriter.Create (Path.Combine (strOutputDir, strXmlFileName), XmlSettings); '\t \t \t \t \t \t serializer.Serialize (nhà văn, VcdMsg); \t \t \t \t \t \t writer.Close(); – MoonKnight

+1

+1: Chỉ cần những gì tôi cần cho cùng một vấn đề (và một lời giải thích tốt). @ Pankaj: Tại sao điều này không được đánh dấu là câu trả lời đúng? –

+0

hoàn hảo, cảm ơn bạn Vlad! – inside

-5

giải pháp Quickie - chuyển sang chuỗi và sau đó loại bỏ như vậy - Sử dụng một nút bấm để bắt đầu thực hiệ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

Giải thích, xin vui lòng? – vonbrand

3

Bạn nên viết:

XmlSerializer sr = new XmlSerializer(typeof(Users)); 
XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add("",""); 
sr.Serialize(ms, this, ns); 
Các vấn đề liên quan