2011-11-09 75 views
20

我使用c#序列化一个对象。我得到这种格式的结果波纹管xml序列化 - 删除命名空间

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

但我希望导致这种格式。

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

这里我的代码

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

也许这将帮助 http://stackoverflow.com/questions/625927/omitting-all-xsi-and-xsd-namespaces-when -serializing-AN-对象在网 http://stackoverflow.com/questions/6037948/remove-namespaces-during-xml-serialization – Mithir

+0

序列化的OB时[省略所有的xsi和xsd命名空间的可能的复制ject in .NET?](http://stackoverflow.com/questions/625927/omitting-all-xsi-and-xsd-namespaces-when-serializing-an-object-in-net) –

回答

50

您应该简单地与[XmlElement("User")]

此属性替换[XmlArray("Users")]告诉序列化,要存储在特定节点“用户”所有这些用户的项目,如果您将其替换为XmlElement,serialzer会将所有这些用户以内联方式存储(位于第一个用户标签下),就像您喜欢它一样。

至于xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"命名空间。它们是自动添加的,但它们是无害的,因为所有元素都在默认名称空间中。你可能为了去除这些添加以下代码到您的通话XmlSerializer

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

您可能还会发现XmlSettings对XML文件的布局非常有用:'XmlWriter writer; XmlSettings.Indent = true; XmlSettings.NewLineOnAttributes = true; \t作家= XmlWriter.Create(Path.Combine(strOutputDir,strXmlFileName),XmlSettings);'\t \t \t \t \t \t serializer.Serialize(作家,VcdMsg); \t \t \t \t \t \t writer.Close(); – MoonKnight

+1

+1:正是我需要的同一个问题(和一个很好的解释)。 @Pankaj:为什么这不是正确的答案? –

+0

完美,谢谢弗拉德! – inside

-5

晨间的解决方案 - 转换为字符串,然后拆下因此 - 使用一个按钮,点击开始执行。

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

请解释一下吗? – vonbrand

3

你应该写:

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