如何使用 XmlSerializer 指定 XmlAttributes 的顺序

问题描述 投票:0回答:6

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 serialization xml-serialization xml-attribute
6个回答
12
投票

您不需要,因为属性在 XML 中没有顺序(XML 建议的第 3.1 节说:“请注意,开始标记或空元素标记中属性规范的顺序并不重要。”)。


11
投票

根据我的经验,属性的序列化顺序与定义公共属性的顺序相同。但是,如果将属性与同一类中的字段组合在一起,例如

[Serializable()]
public class MyClass
{
   [XmlAttribute("ADoubleProp")]
   public double ADoubleProp { get; set; }

   [XmlAttribute("AnIntField")]
   public int AnIntField = 42;
}

然后字段首先被写入属性,然后是属性。上面的代码会产生这样的结果

<MyClass AnIntField="42" ADoubleProp="0" />

1
投票

在 C# 中,据我所知,属性的顺序按照它们在类中定义的顺序进行序列化。

请参阅我对此问题的回答:https://stackoverflow.com/a/21468092/607117


0
投票

如果您动态创建 XML,请尝试更改将属性附加到节点的顺序,它应该可以工作:)


0
投票

您可以首先序列化为

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

-1
投票
xmlNode.Attributes.InsertAfter(newAttribute, refAttribute); 
xmlNode.Attributes.InsertBefore(newAttribute, refAttribute);
© www.soinside.com 2019 - 2024. All rights reserved.