C# 4.0 在c中序列化xml对象时如何定义数组元素的顺序

C# 4.0 在c中序列化xml对象时如何定义数组元素的顺序,c#-4.0,xml-serialization,C# 4.0,Xml Serialization,我有下面这节课 [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; } } p

我有下面这节课

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

下面是一些关于如何设置属性顺序的详细信息

例如:

[XmlElement(Order = 11)]
public string Attrib11 { get; set; }
@编辑21:10-10-09-2014

如果执行以下操作对节点进行排序:

[XmlElement(Order = 1)]
public class Node1{
    [XmlElement("Attrib11")]
    public string Attrib11 { get; set; }
    [XmlElement("Attrib12")]
    public string Attrib12 { get; set; }
}
@编辑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];
}
[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; }
}

你需要一个不同的类结构。更像这样:

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];
}
[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]。

我建议使用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是我从
希望这有帮助

谢谢,这将订购要订购的节点阵列组,但不会订购特定节点。很抱歉,我无法将xml输出粘贴到此处。Node1、Node2、Node3订单需要订购,而不是属性B 11感谢您的编辑21:10-10-09-2014。这不能解决我的问题。当我在node1、node2、node3指定顺序时,它会改变整个组,而不是一个特定的节点。请比较预期输出和实际输出当我仔细查看您的代码时,我看到您创建了一个节点数组。所以节点1有两个节点。节点2有两个节点,节点3有两个节点。如果您想将顺序序列化为node1->node2->node3,那么它将同时打印node1而不是node2而不是node3。这甚至是一个更好的解决方案,这样您就不用使用数组,只需使用单个节点!谢谢你,约翰,我会试试这条路。我不需要用MyNode extra Element包装这些内容不,它不起作用,xmltext抛出异常,xmlelement确实包含MyNode包装,我尝试了xmlignore之类的东西,它没有填充任何node1、node2。。。如果您能帮助我摆脱包装器nodeOk,那就太好了。您尝试了[xmlement]public MyNode[]MyNodes{get;set;},这给了您额外的包装器?我最不想尝试的就是使用[XmlArray]。如果这不起作用,那么我必须等到回家后再尝试。您需要使用XML序列化程序吗?因为使用LINQ到XML可能更简单。谢谢,看起来这会起作用。让我试着让你知道。