如何使用XmlSerializer指定XmlAttributes的顺序

11

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" />

to

<MyType start="joe" end="bob" />

这只是为了易读性,实际上只是为了我的利益。

6个回答

12

在XML中,属性没有顺序(XML推荐的第3.1节指出:“请注意,在开始标记或空元素标记中属性规范的顺序不重要。”)。


6
我理解你的观点。然而,我不同意你引用的那句话(我知道那不是你说的),对我来说顺序很重要。是的,两种方式都可以,但我在乎并且想要设置这个顺序 :'( - demoncodemonkey
2
顺便提一下,存在所谓的规范化XML,其中属性按字典顺序排序,请参见http://www.w3.org/TR/xml-c14n11/#DocumentOrder。 - Dirk Vollmar
我明白了。你可以自己实现或封装一个XmlWriter,然后在那里按照你的要求进行排序。 - Lucero

11

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

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

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

然后首先将字段作为属性写入,然后再写入属性。上面的代码将生成类似于以下内容:

然后属性会被写在字段之前。上述代码将产生如下结果

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

1

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

0
如果您正在动态创建XML,请尝试更改将属性附加到节点的顺序,这样应该就可以解决问题 :)

-1
xmlNode.Attributes.InsertAfter(newAttribute, refAttribute); 
xmlNode.Attributes.InsertBefore(newAttribute, refAttribute);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接