Я читаю документ например, следующие с помощью XDocument:XElement сохранить порядок атрибутов
<form>
<hiddencontrols>
<data classid="{5546E6CD-394C-4bee-94A8-4425E17EF6C6}" datafieldname="opportunityid" id="opportunityid"/>
<data classid="{5546E6CD-394C-4bee-94A8-4425E17EF6C6}" datafieldname="producttypecode" id="producttypecode"/>
</hiddencontrols>
</form>
Примера загрузка:
XmlReader rdr = XmlReader.Create(new System.IO.StringReader(xmlString));
XDocument xdoc = XDocument.Load(rdr, LoadOptions.None);
foreach (XElement xe in xdoc.Root.DescendantsAndSelf()) {
if (xe.NodeType == XmlNodeType.Element) {
if (xe.HasAttributes) {
foreach (XAttribute xa in xe.Attributes()) {
В рамках Еогеаспа итерировать атрибуты, исходный порядок следования атрибуты в исходном XML НЕ сохраняются. То есть, когда я снова выписываю атрибуты изнутри foreach, они записываются в другом порядке из исходного XML.
Пример вывода (только из первого узла данных):
<data id="new_opportunityid" datafieldname="opportunityid" classid="{5546E6CD-394C-4bee-94A8-4425E17EF6C6}"/>
Я попытался определить, есть ли некоторая согласованность применяется, существует (например, всегда ли бежит XElement
анализатор в обратном порядке, или аналогичный.) не является различимым шаблоном для порядка атрибутов. Я также пытался использовать только XmlReader
без загрузки в XDocument
, я пробовал загружать XDocument
из MemoryStream
, а не из XmlReader
. Все подходы дают тот же результат.
Я знаю, что в атрибуте атрибута спецификации XML не является существенным, это важно для меня, потому что я делаю преобразование значения атрибута внутри foreach, и я хочу иметь возможность разграничить окончательный документ с оригиналом, не имея для учета различного порядка атрибутов, но просто видя изменения в значениях. Это также имеет значение для размера diff в пределах контроля источника.
Невозможно воспроизвести - см. [Эта скрипка] (https://dotnetfiddle.net/Vc8x3Q), они находятся в порядке документа. Что вы подразумеваете под «выписыванием атрибутов»? –
В стороне, проверка «NodeType» не требуется, 'DescendantsAndSelf' возвращает только элементы. Вы также можете упростить синтаксический анализ, просто используя 'XDocument.Parse (xmlString)'. –
Вы проверили в отладчике, что после того, как читатель/парсер завершится с вашим xml, ваши элементы имеют атрибуты в том порядке, в котором вы хотите? –