Insertando nodos en un XML

Febrero 20, 2008

Tratar XML con el framework .NET 2.0 tiene cierto grado de complejidad debido a que el api System.Xml es demasiado granular en funcionalidad. En días recientes nos enfretamos a la siguiente situación. ¿Cómo agregar subnodos a un nodo dentro de un XML ya existente? Por ejemplo,tenemos el siguiente XML:
 

<?xml version=”1.0″ encoding=”UTF-8″ ?>
 <numbers>
  <primes>
   <prime>
    <length>1</length>
    <value>3</value>
   </prime><prime>
   <length>2</length>
    <value>37</value>
   </prime>
   <prime>
    <length>3</length>
    <value>479</value>
   </prime>
  </primes>
</numbers>


Y queremos agregar subnodos “prime” a nodo “primes”. Asumiendo que tenemos el XML en un objeto DOM (XmlDocument) sería de la siguiente manera:

//Selección del Xpath donde queremos insertar los subnodos
XmlNode nodo = objXml.SelectSingleNode(“/numbers/primes”);
//Creación del subnodo
XmlElement elmNodo = objLlave.CreateElement(“length”);
XmlText elmTextoNodo = objLlave.CreateTextNode(“4″);
XmlElement elmValor = objLlave.CreateElement(“value”);
XmlText elmTextoValor = objLlave.CreateTextNode(“1019″);
//Creamos el subnodo
XmlElement elmPrime = objLlave.CreateElement(“prime”);
//Agregamos los valores al subnodo
elmPrime .AppendChild(elmNodo);
elmPrime .LastChild.AppendChild(elmTextoNodo);
elmPrime .AppendChild(elmValor);
elmPrime .LastChild.AppendChild(elmTextoValor);
//Agregamos el subnodo al nodo del xml
nodo.AppendChild(elmPrime);

Con lo cual el nuevo XML quedaría de la siguiente manera: 

<?xml version=”1.0″ encoding=”UTF-8″ ?>
 <numbers>
  <primes>
   <prime>
    <length>1</length>
    <value>3</value>
   </prime>
<prime>
    <length>2</length>
    <value>37</value>
   </prime>
   <prime>
    <length>3</length>
    <value>479</value>
   </prime>
   <prime>
    <length>4</length>
    <value>1019</value>
   </prime>
  </primes>
 </numbers>

2 Responses to “Insertando nodos en un XML”

  1. David Says:

    Como puedo agregar mas nodos si los datos provienen de texbox??
    Este es mi codigo:

    public void creaXML()
    {
    System.Xml.Linq.XDocument miXML = new XDocument(new XDeclaration(“1.0″, “utf-8″, “yes”),
    new XComment(“Lista de Personal”),
    new XElement(“Personas”,
    new XElement(“Cliente”,
    new XElement(“Nombre”, txtNombre.Text),
    new XElement(“Apellido”, txtApellido.Text),
    new XElement(“Edad”, txtEdad.Text.ToString()),
    new XElement(“Domicilio”, txtDomicilio.Text))
    )
    );
    miXML.Save(@”c:\miXML.xml”);
    }

  2. David Says:

    Estoy intentando hacer esto pero solo me sobreescribe el XML con los nuevos datos que introduzco en los textbox

    public void insertaNodo()
    {
    XmlDocument xmlmio = new XmlDocument();
    xmlmio.Load((@”c:\miXML.xml”));

    XmlNode nodo = xmlmio.DocumentElement;

    XmlElement uno = xmlmio.CreateElement(“Nombre”);
    XmlText txtuno = xmlmio.CreateTextNode(txtNombre.Text);
    XmlElement dos = xmlmio.CreateElement(“Apellido”);
    XmlText txtdos = xmlmio.CreateTextNode(txtApellido.Text);
    XmlElement tres = xmlmio.CreateElement(“Edad”);
    XmlText txttres = xmlmio.CreateTextNode(txtEdad.Text);
    XmlElement cuatro = xmlmio.CreateElement(“Domicilio”);
    XmlText txtcuatro = xmlmio.CreateTextNode(txtDomicilio.Text);

    XmlElement node = xmlmio.CreateElement(“Cliente”);

    node.AppendChild(uno);
    node.LastChild.AppendChild(txtuno);
    node.AppendChild(dos);
    node.LastChild.AppendChild(txtdos);
    node.AppendChild(tres);
    node.LastChild.AppendChild(txttres);
    node.AppendChild(cuatro);
    node.LastChild.AppendChild(txtcuatro);

    nodo.AppendChild(node);
    }


Leave a Reply