Tengo un XDocument y tengo que eliminar un nodo y volver a agregar el mismo nodo después de alguna manipulación (mi nodo xelement es complejo y tiene nodos internos como bien). ¿Alguien ha conseguido una buena manera de hacerlo ya que mi nuevo nodo manipulado se agrega al final del xmldocument? Cualquier fragmento de código sería muy apreciado.Linq a XML: elimine un nodo y agregue un nuevo nodo en el mismo lugar
Respuesta
Si acaba de editar el nodo, entonces ¿por qué quitarlo del todo? Solo haz una referencia en el árbol y edítalo en el lugar.
Si eso no es una opción, por alguna razón, entonces una forma de hacerlo es la siguiente: una vez que haya encontrado el XElement
(o, en general, XNode
) es necesario sustituir en el árbol, cree un nuevo XElement
para servir como reemplazo, y luego use el método XNode.ReplaceWith
en el elemento anterior, pasando uno nuevo como argumento.
Si entiendo bien, esto debería ayudarlo a hacerlo.
SolarSystem.xml:
<?xml version="1.0" encoding="UTF-8"?>
<SolarSystem>
<Planets>
<Planet Id="1">
<Name>Mercury</Name>
</Planet>
<Planet Id="2">
<Name>Venus</Name>
</Planet>
<Planet Id="3">
<Name>Earth</Name>
</Planet>
</Planets>
</SolarSystem>
El código encuentra el <Planet>
Mercurio, añade un elemento adicional a ella, lo elimina y vuelve a insertar al final de la colección <Planets>
.
XDocument SolarSystem = XDocument.Load(Server.MapPath("SolarSystem.xml"));
IEnumerable<XElement> Planets = SolarSystem.Element("SolarSystem").Element("Planets").Elements("Planet");
// identify and change Mercury
XElement Mercury = Planets.Where(p => p.Attribute("Id").Value == "1").FirstOrDefault();
Mercury.Add(new XElement("YearLengthInDays", "88"));
// remove Mercury from current position, and add back in at the end
Mercury.Remove();
Planets.Last().AddAfterSelf(Mercury);
// save it as new file
SolarSystem.Save(Server.MapPath("NewSolarSystem.xml"));
lo que da:
<?xml version="1.0" encoding="UTF-8"?>
<SolarSystem>
<Planets>
<Planet Id="2">
<Name>Venus</Name>
</Planet>
<Planet Id="3">
<Name>Earth</Name>
</Planet>
<Planet Id="1">
<Name>Mercury</Name>
<YearLengthInDays>88</YearLengthInDays>
</Planet>
</Planets>
</SolarSystem>
Esto solo se basa en el ejemplo anterior de @Ralph Lavelle. Creé una aplicación de consola completa para poder jugar con el código & y comprenderlo mejor. Pensé que lo compartiría. Utiliza exactamente el mismo XML de muestra de arriba, pero tuve que eliminar las referencias a Server.MapPath() ya que no pude encontrar la manera de hacerlo funcionar. Aquí tienes:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
class LinqDemo
{
static void Main()
{
XDocument SolarSystem = XDocument.Load("SolarSystem.xml");
IEnumerable<XElement> Planets = SolarSystem.Element("SolarSystem").Element("Planets").Elements("Planet");
// identify and change Mercury
XElement Mercury = Planets.Where(p => p.Attribute("Id").Value == "1").FirstOrDefault();
Mercury.Add(new XElement("YearLengthInDays", "88"));
// remove Mercury from current position, and add back in at the end
Mercury.Remove();
Planets.Last().AddAfterSelf(Mercury);
// save it as new file
SolarSystem.Save("NewSolarSystem.xml");
}
}
Quizás esto ayude a otro novato de LINQ como yo.
Aprecie el ejemplo de trabajo conciso. Se encontró que 'using System;' es *** *** *** requerido. Pero eso 'usando System.Xml;' *** es *** obligatorio. – DavidRR
Eres bienvenido. Odio encontrar una pregunta que parece tener la respuesta que estoy buscando y un código impreciso sobre cómo hacerlo. Buena captura en el error de uso. – delliottg
- 1. Cómo añadir un nuevo nodo a XML
- 2. seleccione XML Nodo usando LINQ to XML
- 3. crear un nuevo nodo en jstree
- 4. C#: Modificar un nodo XML
- 5. ¿Agregar un documento xml a un nodo xml en C#?
- 6. XSLT - Copie todos los otros nodos, agregue 1 nuevo nodo
- 7. Agregar atributos a un nodo XML
- 8. ¿Cómo recorro un nodo XML en JavaScript?
- 9. eliminando un nodo específico en xml
- 10. Linq a XML seleccionando un nodo bases en un valor de atributo
- 11. La adición de un prefijo a un nodo XML
- 12. Inserte un nodo en un lugar específico en Ext.tree.panel
- 13. XPath: Por defecto a 'nodo A', seleccione 'Nodo B' en lugar si Nodo B no está vacío
- 14. Cómo obtener el nodo XML de XDocument
- 15. Erlang: RPC a un nodo con salida en ese nodo
- 16. Cambiar un valor de nodo XML
- 17. Cómo convertir un nodo XML a una estructura C++?
- 18. Cómo cambiar el nombre del nodo XML
- 19. ¿Cómo se insertan XML en un nodo XML existente
- 20. ¿Cómo selecciono un nodo XML con el valor más largo del nodo #texto hijo con XPath?
- 21. xRuta/HTML: Elija un nodo basado en el nodo relacionado
- 22. Un programa simple para nodo CRUD y valores de nodo del archivo xml
- 23. ¿Cómo crear un nodo duplicado desde un nodo en Neo4j?
- 24. Reemplazar el texto interno de un nodo/elemento Xml
- 25. recuperar el valor del nodo XML y atributo de nodo utilizando XPath en JAXP
- 26. Insertar nodo del mismo nivel en JS
- 27. graphviz: Crear un nuevo nodo con esta misma etiqueta
- 28. Agregar un nuevo nodo al objeto XmlDocument existente
- 29. XPath y selección de un solo nodo
- 30. Java/DOM: Obtenga el contenido XML de un nodo
+1: Muestra de Nice 101 para que la gente comience –