使用 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];
}
}
我正在尝试通过将 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];
}
}