J'ai un menu XML "plat" que j'ai besoin de structurer.Génération d'arborescence XML
arbre XML actuel:
<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>
Cet arbre XML doivent être reodered d'avoir des relations correctes entre ID: s et 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>
Iv obtenu le code suivant pour essayer d'accomplir cela:
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;
}
Comme vous pouvez le voir, mes nœuds contiennent également "type" et "name". Les types sont utilisés pour déterminer si un noeud est un "dossier" ou un "produit".
Mon problème est que ceci ne renvoient pas le bon XML. Si je supprime les nodes.RemoveChild (n) dans la dernière section alors ça marche super bien mais je veux enlever les enfants (products, type = 1) que je connais n'ont pas d'enfants.
Si ce code est exécuté. Je n'ai que quelques nœuds.
qui l'a fait! Merci, ravi de voir comment les pros s'en sortent! – Marthin
Je voulais être rapide et utiliser le code que je connais par cœur. Avec plus de temps j'aurais essayé de jouer avec System.Xml.Linq. Il est beaucoup plus facile de manipuler Xml avec cet assemblage – PierrOz