2011-11-09 4 views
20

C#을 사용하여 개체를 serialize하는 중입니다. 나는이 형식으로 결과를 얻고있다.xml serialization - 네임 스페이스 제거

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

당신은 단순히 당신이 "사용자"특정 노드에서 모든 사용자 항목을 저장하는 것인지, 시리얼에게 [XmlElement("User")]

이 속성으로 [XmlArray("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 산부인과를 직렬화 때 모든 XSI 및 XSD 네임 스페이스를 생략의 – Mithir

+0

가능한 중복 NET에서 ject?] (http://stackoverflow.com/questions/625927/omitting-all-xsi-and-xsd-namespaces-when-serializing-an-object-in-net) –

답변

50

내 코드, 경우 XmlElement으로 바꾸면 serialzer는 사용자가 좋아하는 것처럼 모든 사용자를 인라인 (첫 번째 사용자 태그 바로 아래)에 저장합니다.

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 네임 스페이스와 같습니다. 모든 요소가 기본 네임 스페이스에 있으므로 자동으로 추가되지만 무해합니다.

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

퀵 솔루션 - 문자열로 변환하고, 따라서 제거 - 실행을 시작하는 버튼 클릭을 사용 : 당신은 사람들을 제거하기 위해 당신의 XmlSerializer 호출에 다음 코드를 추가 할 수 있습니다.

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);