Как указать порядок XmlAttributes с помощью XmlSerializer

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

Это просто для удобства чтения, на самом деле моя собственная выгода.


person demoncodemonkey    schedule 12.04.2010    source источник


Ответы (4)


Вы этого не сделаете, поскольку атрибуты не имеют порядка в XML (раздел 3.1 рекомендации XML гласит: «Обратите внимание, что порядок спецификаций атрибутов в начальном теге или теге пустого элемента не имеет значения»).

person Lucero    schedule 12.04.2010
comment
Я принимаю вашу точку зрения. Однако я должен не согласиться с тем утверждением, которое вы процитировали (я знаю, что это не ваши слова), порядок для меня важен. Да, это все равно будет работать в любом случае, но мне все равно, и я хочу установить порядок :'( - person demoncodemonkey; 12.04.2010
comment
Кроме того, существует так называемый канонический XML, в котором атрибуты сортируются лексикографически, см. w3. .org/TR/xml-c14n11/#DocumentOrder - person Dirk Vollmar; 12.04.2010
comment
Я понимаю. Что вы можете сделать, так это иметь свою собственную реализацию или оболочку для XmlWriter, а затем отсортировать их по своему усмотрению. - person Lucero; 12.04.2010

По моему опыту, порядок сериализации атрибутов такой же, как и порядок, в котором вы определяете свои общедоступные свойства. Однако, если вы объединяете свойства с полями в одном классе, например.

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

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

тогда поля записываются сначала как атрибуты, а затем как свойства. Приведенный выше код создаст что-то вроде этого

<MyClass AnIntField="42" ADoubleProp="0" />
person Darien Pardinas    schedule 23.09.2014

В С#, насколько я нашел, порядок атрибутов сериализуется в том порядке, в котором они определены в классе.

См. мой ответ на этот вопрос здесь: https://stackoverflow.com/a/21468092/607117

person Derreck Dean    schedule 30.01.2014

Если вы создаете XML динамически, попробуйте изменить порядок, в котором вы добавляете атрибут к узлу, и он должен работать :)

person Dinesh Masilamani    schedule 13.07.2019