2014-09-10 3 views
2

다음 클래스가 있습니다. 코드 아래C에서 xml 객체를 직렬화하는 동안 배열 요소의 순서를 정의하는 방법 #

[XmlRoot("MyRoot")] 
public class MyRoot 
{ 
    [XmlElement("Node1")] 
    public Node1[] Node1 { get; set; } 
    [XmlElement("Node2")] 
    public Node2[] Node2 { get; set; } 
    [XmlElement("Node3")] 
    public Node3[] Node3 { get; set; } 

} 

public class Node1 
{ 
    [XmlElement("Attrib11")] 
    public string Attrib11 { get; set; } 
    [XmlElement("Attrib12")] 
    public string Attrib12 { get; set; } 
} 

public class Node2 
{ 
    [XmlElement("Attrib21")] 
    public string Attrib21 { get; set; } 
    [XmlElement("Attrib22")] 
    public string Attrib22 { get; set; } 
} 
public class Node3 
{ 
    [XmlElement("Attrib31")] 
    public string Attrib31 { get; set; } 
    [XmlElement("Attrib32")] 
    public string Attrib32 { get; set; } 
} 

이 데이터를 작성하여 직렬화

var abc = new XML834.MyRoot(); 
abc.Node1 = new XML834.Node1[] { new XML834.Node1() { Attrib11 = "a11", Attrib12 = "b12" }, new XML834.Node1() { Attrib11 = "c11", Attrib12 = "c12" } }; 
abc.Node2 = new XML834.Node2[] { new XML834.Node2() { Attrib21 = "a21", Attrib22 = "b22" }, new XML834.Node2() { Attrib21 = "c21", Attrib22 = "c22" } }; 
abc.Node3 = new XML834.Node3[] { new XML834.Node3() { Attrib31 = "a31", Attrib32 = "b32" }, new XML834.Node3() { Attrib31 = "c31", Attrib32 = "c32" } }; 

string xmlString = null; 
using (MemoryStream memoryStream = new MemoryStream()) 
using (XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8)) 
{ 
    XmlSerializer xs = new XmlSerializer(typeof(XML834.MyRoot)); 
    xs.Serialize(xmlTextWriter, abc); 
    MemoryStream memoryBaseStream; 
    memoryBaseStream = (MemoryStream)xmlTextWriter.BaseStream; 
    UTF8Encoding encoding = new UTF8Encoding(); 
    xmlString = encoding.GetString(memoryBaseStream.ToArray()); 
    memoryBaseStream.Dispose(); 
    xmlTextWriter.Close(); 
    memoryStream.Close(); 
    Console.WriteLine(xmlString); 
} 

내가 얻고 출력은 내가 배열 항목의 순서를 지정하려고

<?xml version="1.0" encoding="utf 8" ?> 
<MyRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema instance"> 
<Node1> 
    <Attrib11>a11</Attrib11> 
    <Attrib12>b12</Attrib12> 
</Node1> 
<Node1> 
    <Attrib11>c11</Attrib11> 
    <Attrib12>c12</Attrib12> 
</Node1> 
<Node2> 
    <Attrib21>a21</Attrib21> 
    <Attrib22>b22</Attrib22> 
</Node2> 
<Node2> 
    <Attrib21>c21</Attrib21> 
    <Attrib22>c22</Attrib22> 
</Node2> 
<Node3> 
    <Attrib31>a31</Attrib31> 
    <Attrib32>b32</Attrib32> 
</Node3> 
<Node3> 
    <Attrib31>c31</Attrib31> 
    <Attrib32>c32</Attrib32> 
</Node3> 
</MyRoot> 

입니다. 이 출력을 얻을 수 있습니까?

<?xml version="1.0" encoding="utf 8" ?> 
<MyRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema instance"> 
<Node1> 
    <Attrib11>a11</Attrib11> 
    <Attrib12>b12</Attrib12> 
</Node1> 
<Node2> 
    <Attrib21>a21</Attrib21> 
    <Attrib22>b22</Attrib22> 
</Node2> 
<Node3> 
    <Attrib31>c31</Attrib31> 
    <Attrib32>c32</Attrib32> 
</Node3> 
<Node1> 
    <Attrib11>c11</Attrib11> 
    <Attrib12>c12</Attrib12> 
</Node1> 
<Node2> 
    <Attrib21>c21</Attrib21> 
    <Attrib22>c22</Attrib22> 
</Node2> 
<Node3> 
    <Attrib31>a31</Attrib31> 
    <Attrib32>b32</Attrib32> 
</Node3> 
</MyRoot> 

답변

2

내가 XElement를를 사용하는 것이 좋습니다이

public class Wrapper 
{ 
    [XmlElement("Node1")] 
    public Node1 Node1 { get; set; } 
    [XmlElement("Node2")] 
    public Node2 Node2 { get; set; } 
    [XmlElement("Node3")] 
    public Node3 Node3 { get; set; } 
} 


[XmlRoot("MyRoot")] 
public class MyRoot 
{ 
      private List<Wrapper> _wrappers; 

      public MyRoot() { _wrappers = new List<Wrapper>(); } 

    public List<Wrapper> Wrappers 
    { 
      get { return _wrappers; } 
      set { _wrappers = value; } 
    } 

    public string Serialize() 
    { 
     if (_wrappers.Any()) 
     { 
      XElement inner = new XElement("MyRoot"); 
      foreach (var w in _wrappers) 
      { 

       if (w.Node1 != null) 
        inner.Add( w.Node1.ToXElement<Node1>()); 
       if (w.Node2 != null) 
        inner.Add( w.Node2.ToXElement<Node2>()); 
       if (w.Node3 != null) 
        inner.Add(w.Node3.ToXElement<Node3>()); 
      } 
      return inner.ToString(); 
     } 
     return string.Empty; 
    } 
} 

ToXElement처럼 직렬화를 사용자 정의 할 것은 내가이 도움이 here 희망에서 가져온 확장입니다!

+0

감사합니다. 작동 할 것 같습니다. 내가 너를 알려주려고하자. – Esen

+0

빙고, 그것은 매력처럼 일했습니다. 고맙습니다. – Esen

0

여기서는 속성 순서를 설정하는 방법에 대한 자세한 정보를 제공합니다. 예를 들어

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.order(v=vs.110).aspx

:

[XmlElement(Order = 11)] 
public string Attrib11 { get; set; } 

@Edit 21시 10분 - 2014년 10월 9일

당신이 노드 정렬하려면 다음과 같은 경우 :

[XmlElement(Order = 1)] 
public class Node1{ 
    [XmlElement("Attrib11")] 
    public string Attrib11 { get; set; } 
    [XmlElement("Attrib12")] 
    public string Attrib12 { get; set; } 
} 

@edit 21:17 다음과 같이 시도하면

int maxLength = Math.Max(node1.length, node2.length, node3.length); 
for(int i = 0; i < maxLength; i++){ 
serialize node1[i]; 
serialize node2[i]; 
serialize node3[i]; 
} 
+0

감사합니다. 그러면 노드 배열 그룹이 정렬되지만 특정 노드는 순서가 지정되지 않습니다. 죄송합니다 여기에 XML 출력을 붙여 넣을 수 없습니다. Node1, Node2, Node3 주문은 attrib11이 아닌 주문해야합니다 – Esen

+0

21:10 - 10-09-2014 수정 해 주셔서 감사합니다. 그것은 내 문제를 해결하지 못합니다. node1, node2, node3에서 주문을 지정할 때 특정 그룹이 아닌 전체 그룹을 변경합니다. 예상과 실제 출력을 비교하십시오. – Esen

+0

코드를 자세히 살펴보면 노드 배열을 만드는 것을 볼 수 있습니다. 따라서 node1에는 두 개의 노드가 있습니다. node2에는 두 개의 노드가 있고 node3에는 두 개의 노드가 있습니다. 순서를 node1 -> node2 -> node3에서와 같이 직렬화하려는 경우 두 노드 모두 node2와 두 노드 모두보다 모두 인쇄하는 것이 좋습니다. – Sliver2009

2

다른 클래스 구조가 필요합니다. 더 이런 식으로 뭔가 : 당신이 올바른 순서를 얻을 것이다, 또한 당신의 "노드"주위에 당신에게 여분의 요소를 줄 것이다 이제

[XmlRoot("MyRoot")] 
public class MyRoot 
{ 
    public MyNode[] MyNodes {get;set;} 
} 

public class MyNode 
{ 
    [XmlElement("Node1")] 
    public Node1 Node1 { get; set; } 
    [XmlElement("Node2")] 
    public Node2 Node2 { get; set; } 
    [XmlElement("Node3")] 
    public Node3 Node3 { get; set; } 
} 

. 나는 그것을 없애는 방법을 기억하지 않습니다. MyNodes 속성에서 [XmlText] 또는 [XmlElement]을 시도하십시오.

+0

이 방법은 배열을 사용하지 않고 단수의 노드 만 사용하는 더 멋진 솔루션입니다! – Sliver2009

+0

존 감사합니다,이 길을 시도해 보겠습니다. 나는 이것들을 MyNode (여분의 요소)로 싸서 쓸 필요가 없다. – Esen

+0

아니, 작동하지 않았다. xmltext는 예외를 던졌다. xmlelement는 MyNode 래퍼를 포함하고, 나는 node1, node2를 채우지 않은 xmlignore와 같은 다른 것들을 시도했다. ..래퍼 노드를 제거하는 법을 도와 줄 수 있다면 대단 할 것입니다. – Esen

관련 문제