我有一个“扁平”的XML菜单,我需要构造。XML树的生成
当前XML树:
<root>
<nodes>
<node>
<id>5</id>
<parent>1</parent>
</node>
<node>
<id>8</id>
<parent>5</parent>
</node>
<node>
<id>14</id>
<parent>8</parent>
</node>
<node>
<id>26</id>
<parent>1</parent>
</node>
</nodes>
</root>
此XML树需要被reodered有ID之间的正确关系:S和PARENTID:S
<root>
<nodes>
<node>
<id>5</id>
<parent>1</parent>
<node>
<id>8</id>
<parent>5</parent>
<node>
<id>14</id>
<parent>8</parent>
</node>
</node>
</node>
<node>
<id>26</id>
<parent>1</parent>
</node>
</nodes>
</root>
㈣得到了下面的代码,以尽力去完成这样的:
public XmlDocument SortXmlNodeTree(XmlDocument udoc)
{
XmlDocument sortedDoc = new XmlDocument();
sortedDoc.LoadXml(xmlStartString);
//select top nodes
//top node -> find all siblings. For each sibling add sibling.siblings. ->loop
XmlNode nodes = udoc.DocumentElement.LastChild;
foreach(XmlNode n in nodes)
{
//get top nodes and check if they are folders
if (n["parent"].InnerText.Equals("1") && n["type"].InnerText.Equals("2"))
{
XmlNode newNode = sortedDoc.ImportNode(n, true);
GetNodeSiblings(ref nodes, newNode, ref sortedDoc);
SortedDoc.DocumentElement.FirstChild.AppendChild(newNode);
}
}
return sortedDoc;
}
public XmlNode GetNodeSiblings(ref XmlNode nodes, XmlNode currentNode, ref XmlDocument tree)
{
if (!nodes.HasChildNodes)
{
return null;
}
foreach (XmlNode n in nodes)
{
// if we have a folder and parent is currentNode, go deeper
if (n["type"].InnerText.Equals("2") && n["parent"].InnerText.Equals(currentNode["id"].InnerText))
{
XmlNode newNode = tree.ImportNode(n, true);
GetNodeSiblings(ref nodes, newNode, ref tree);
currentNode.AppendChild(newNode);
}
// if we have a product that has currentNode as parent, add it.
else if (!n["type"].InnerText.Equals("2") && n["parent"].InnerText.Equals(currentNode["id"].InnerText))
{
XmlNode newNode = tree.ImportNode(n, true);
nodes.RemoveChild(n);
currentNode.AppendChild(newNode);
}
}
return null;
}
正如你可以看到我的节点也包含“类型”和“名称”。类型用于确定节点是“文件夹”还是“产品”。
我的问题是,这dosn't返回正确的XML。如果我在最后一节删除nodes.RemoveChild(n),那么它的工作效果很好,但是我想删除我知道没有任何孩子的孩子(产品,type = 1)。
如果此代码已运行。我只有几个节点。
做到了!谢谢,很高兴看到亲们如何处理这个问题! – Marthin 2010-09-07 11:18:28
我想快速使用我熟悉的代码。有更多的时间,我会尝试玩System.Xml.Linq。用这个程序集处理Xml要容易得多 – PierrOz 2010-09-07 11:42:24