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: