Перемещение узлов XML вверх / вниз с помощью Linq - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь переупорядочить 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>

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

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

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

1 Ответ

0 голосов
/ 29 ноября 2018

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

   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];
        }
    }
...