Я пытаюсь изменить порядок 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>





Попробуйте что-нибудь такое простое. Я создаю список элементов, а затем двигаюсь вверх или вниз в зависимости от номера индекса.
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];
}
}