query leer example create crear archivo c# xml tree linq-to-xml

leer - system xml linq example c#



Reestructurar un árbol XML basado en la secuencia de elementos con "ID" e "ID padre" (1)

Aquí hay un enfoque de mutación y se basa en los efectos secundarios . No es tan limpio como la recursividad y la reconstrucción, pero a menudo es "suficiente". Y, es bastante fácil de escribir.

Entrada "XML":

var root = XElement.Parse(@"<root> <group id=''1'' /> <group id=''4'' parent=''2'' /> <group id=''2'' parent=''1'' /> <group id=''3'' parent=''2'' /> <group id=''5'' /> </root>");

Conviértete en árbol:

// So we can find parent by ID var groupMap = root.Elements("group") .ToDictionary(e => (string)e.Attribute("id"), e => e); // ToList so we don''t iterate modified collection foreach (var e in root.Elements().ToList()) { XElement parent; if (groupMap.TryGetValue((string)e.Attribute("parent") ?? "", out parent)) { // Unlike standard XML DOM, // make sure to remove XElement from parent first e.Remove(); // Add to correct parent parent.Add(e); } } // LINQPad :-) // root.Dump();

Salida XML:

<root> <group id="1"> <group id="2" parent="1"> <group id="4" parent="2" /> <group id="3" parent="2" /> </group> </group> <group id="5" /> </root>

Lo que quiero que suceda es que quiero poner dentro del elemento cuya ID es igual a ParentID? Entonces, como en mi ejemplo, el Grupo cuyo ParentId = 1 debe estar dentro del Grupo cuyo Id = 1 ¿Cómo puedo hacer esto? Estoy tan confundido ..

A partir de ahora aquí está mi código:

XElement xroot = new XElement("Root"); XElement xnavigations = null; XElement xmenus = null; foreach (DataRow navigations in GetNavigationSets().Rows) { xnavigations = new XElement("Group", new XElement("GroupName", navigations["name"].ToString()) ); xnavigations.SetAttributeValue("Id", navigations["id"].ToString()); xnavigations.SetAttributeValue("ParentId", navigations["parent_id"].ToString()); foreach (DataRow menus in GetMenusInNavigationSetByNavigation(int.Parse(navigations["id"].ToString())).Rows) { foreach (DataRow menu in GetMenuById(int.Parse(menus["menu_id"].ToString())).Rows) { xmenus = new XElement("Menu", new XElement("Name", menu["name"].ToString()), new XElement("Price", menu["price"].ToString()), new XElement("Description", menu["description"].ToString()) ); xnavigations.Add(xmenus); } } xroot.Add(xnavigations); } xroot.Save("main.xml");

Nuevo resultado: