Перемещение узлов Xml вверх / вниз с помощью Linq

Я пытаюсь изменить порядок xmlnodes, сравнивая их со строками с данными. Ниже мой код и пример.

    <OrderDetails>
  <StockLine>        
    <StockCode>StockCode1</StockCode>
    <StockDescription>Description1</StockDescription>
  </StockLine>
  <StockLine>        
    <StockCode>StockCode2</StockCode>
    <StockDescription>Description2</StockDescription>        
  </StockLine>
  <CommentLine>        
    <Comment>Comment1</Comment>        
  </CommentLine>
  <CommentLine>       
    <Comment>Comment2</Comment>        
  </CommentLine>
</OrderDetails>

Я запрашиваю это в своей таблице данных, чтобы переместить узел комментария вверх / вниз. Если столбец "комментарий" таблицы данных имеет какое-либо значение, добавьте узел комментария под соответствующий узел линии запаса. Если столбец таблицы данных "комментарий" не имеет значения, добавьте следующий узел товарной линии.

XDocument xmldoc = XDocument.Parse(myxml);
 var stkline = from node in xmldoc.Descendants("StockLine")
                select node.DescendantNodes().ToList();
            var cmntline = from node in xmldoc.Descendants("CommentLine")
                select node.DescendantNodes().ToList();
for (int i = 0; i < DatatTable.Rows.Count; i++)
            {
                string dtstcode = DatatTable.Rows[i]["StockCode"].ToString();
                string dtstkdes = DatatTable.Rows[i]["Description"].ToString();               
                string dtcmnt = DatatTable.Rows[i]["Comment"].ToString();
                foreach (List<XNode> el in stkline)
                {
                    XNode stckelement = el.FirstOrDefault();
                    XNode nextnode = stckelement.NextNode;

                    foreach (List<XNode> cmntnode in cmntline)
                    {
                        XNode cmnt = cmntnode.FirstOrDefault();

                        if (DatatTable.Rows[i]["Comment"] != null)
                        {
                            cmntnode.Remove();
                            nextnode.AddBeforeSelf(cmnt);
                        }
                    }
                }
            }
            MessageBox.Show(xmldoc.ToString());

Попытка добиться этого результата после организации xml bas

    <OrderDetails>
  <StockLine>        
    <StockCode>StockCode1</StockCode>
    <StockDescription>Description1</StockDescription>
  </StockLine>
  <CommentLine>        
    <Comment>Comment1</Comment>        
  </CommentLine>
  <StockLine>        
    <StockCode>StockCode2</StockCode>
    <StockDescription>Description2</StockDescription>        
  </StockLine>      
  <CommentLine>       
    <Comment>Comment2</Comment>        
  </CommentLine>
</OrderDetails>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

   class XmlMove
    {
        private List<XElement> elements { get; set; }
        private int index = -1;

        public XmlMove(XDocument doc, string elementName)
        {
            elements = doc.Descendants(elementName).ToList();
            index = 0;
        }
        public XElement GetNext()
        {
            if (index == -1 || index >= elements.Count - 1) return null;
            return elements[++index];
        }
        public XElement GetPrevious()
        {
            if (index <= 0 ) return null;
            return elements[--index];
        }
        public XElement GetCurrent()
        {
            if (index == -1) return null;
            return elements[index];
        }
    }

Другие вопросы по теме