XmlElement 有一个 "Order" 属性,在使用 XmlSerializer 进行序列化时,您可以使用该属性来指定属性的精确顺序(无论如何都相对于彼此)。
public class bookingList
{
[XmlElement(Order = 1)]
public string error { get; set; }
[XmlElement(Order = 2)]
public int counter { get; set; }
[XmlElement(ElementName = "booking", Order = 3)]
public List<booking> bookings = new List<booking>();
}
XmlAttribute有类似的东西吗?我只想设置属性的顺序,例如
<MyType end="bob" start="joe" />
到
<MyType start="joe" end="bob" />
这只是为了可读性,确实是我自己的好处。
您不需要,因为属性在 XML 中没有顺序(XML 建议的第 3.1 节说:“请注意,开始标记或空元素标记中属性规范的顺序并不重要。”)。
根据我的经验,属性的序列化顺序与定义公共属性的顺序相同。但是,如果将属性与同一类中的字段组合在一起,例如
[Serializable()]
public class MyClass
{
[XmlAttribute("ADoubleProp")]
public double ADoubleProp { get; set; }
[XmlAttribute("AnIntField")]
public int AnIntField = 42;
}
然后字段首先被写入属性,然后是属性。上面的代码会产生这样的结果
<MyClass AnIntField="42" ADoubleProp="0" />
在 C# 中,据我所知,属性的顺序按照它们在类中定义的顺序进行序列化。
请参阅我对此问题的回答:https://stackoverflow.com/a/21468092/607117
如果您动态创建 XML,请尝试更改将属性附加到节点的顺序,它应该可以工作:)
您可以首先序列化为
XmlDocument
,然后通过删除属性来手动更改属性的顺序,然后按照您想要的顺序再次添加它们。
虽然这不使用 .NET 注释/属性,但它使您可以完全控制属性顺序。
我从我对类似问题的回答中获取了以下代码:
public static void SortAllAttributes(XmlDocument xmlDocument)
{
foreach (XmlElement element in xmlDocument.SelectNodes("//*"))
{
var attributes = element.Attributes
.Cast<XmlAttribute>()
.ToArray();
element.Attributes.RemoveAll();
foreach (var attribute in attributes
.OrderBy(a => a.LocalName) // <-- custom sort order
.ThenBy(a => a.Name))
{
element.Attributes.Append(attribute);
}
}
}
xmlNode.Attributes.InsertAfter(newAttribute, refAttribute);
xmlNode.Attributes.InsertBefore(newAttribute, refAttribute);