使用 Linq 向上/向下移动 Xml 个节点

Move Xml Nodes Up / Down using Linq

我正在尝试通过将 xml 节点与数据 table 行进行比较来重新排序它们。下面是我的代码和一个例子。

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

我正在查询我的数据 table 以移动评论节点 up/down。如果数据 table 列 "comment" 有任何值,则在相应的 stockline 节点下添加注释节点。如果数据 table 列 "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>

尝试像这样简单的事情。我正在创建一个元素列表,然后根据索引号向上或向下移动。

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