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可能更简单。谢谢,看起来这会起作用。让我试着让你知道。