Agregar elementos a un archivo xml en C #

Tengo un archivo XML formateado así:

   testcode1     testcode2   ...  

Puedo cargar los elementos con éxito utilizando XDocument, pero tengo problemas para agregar nuevos elementos (hay muchas funciones y la mayoría de las cuales probé no funcionaron bien para mí). ¿Cómo se haría esto? El nuevo elemento contendría la etiqueta del nombre del fragmento y la etiqueta del código del fragmento. Mi enfoque anterior era abrir el archivo y crear manualmente el elemento usando una cadena que, aunque funciona, es una muy mala idea.

Lo que he intentado:

 XDocument doc = XDocument.Load(spath); XElement root = new XElement("Snippet"); root.Add(new XElement("name", "name goes here")); root.Add(new XElement("SnippetCode", "SnippetCode")); doc.Element("Snippets").Add(root); doc.Save(spath); 

Y el resultado es este:

  name goes here  code goes here   

Funciona bien, excepto que la etiqueta de nombre se genera incorrectamente. Debería ser

  

pero no puedo generar eso apropiadamente.

Estás cerca, pero quieres que el nombre sea un XAttribute lugar de XElement :

  XDocument doc = XDocument.Load(spath); XElement root = new XElement("Snippet"); root.Add(new XAttribute("name", "name goes here")); root.Add(new XElement("SnippetCode", "SnippetCode")); doc.Element("Snippets").Add(root); doc.Save(spath); 

Si desea agregar un atributo, y no un elemento, debe decirlo:

 XElement root = new XElement("Snippet"); root.Add(new XAttribute("name", "name goes here")); root.Add(new XElement("SnippetCode", "SnippetCode")); 

El código anterior produce el siguiente elemento XML:

  SnippetCode  

Id inclinado a crear clases que coincidan con la estructura y agregar una instancia a una colección, luego serializar y deserializar la colección para cargar y guardar el documento.

Necesita crear un nuevo XAttribute lugar de XElement . Pruebe algo como esto:

 public static void Test() { var xdoc = XDocument.Parse(@"    testcode1     testcode2   "); xdoc.Root.Add( new XElement("Snippet", new XAttribute("name", "name goes here"), new XElement("SnippetCode", "SnippetCode")) ); xdoc.Save(@"C:\TEMP\FOO.XML"); } 

Esto genera el resultado:

     testcode1     testcode2    SnippetCode   

He usado XDocument.Root . Agregar para agregar elementos. Root devuelve XElement que tiene una función Add para XElements adicionales

Esta es la extensión a las respuestas anteriores, si su xml tiene espacio de nombre definido ( xmlns ), entonces obtendrá un desagradable efecto secundario al agregar elementos secundarios – xmlns = "" a su nuevo elemento secundario.

Lo que quiere hacer (suponiendo que el elemento que está agregando pertenece al mismo espacio de nombres que su padre) es tomar el espacio de nombres del elemento padre parentElement.GetDefaultNamespace() .

 var child = new XElement(parentElement.GetDefaultNamespace()+"Snippet", new XAttribute("Attr1", "42"), new XAttribute("Attr2", "22")); child.Add(new XAttribute("Attr3", "777")); parentElement.Add(child); 

para elementos principales con múltiples espacios de nombres, puede elegir cuál usar cambiando de parentElement.GetDefaultNamespace()+"Snippet" a parentElement.GetNamespaceOfPrefix("namespacePrefixThatGoesWithColon")+"Snippet" por ej.

 var child = new XElement(parentElement.GetNamespaceOfPrefix("namespacePrefixThatGoesWithColon")+"Snippet", new XAttribute("Attr1", "42"), new XAttribute("Attr2", "22")); 
  

nombre es un atributo, no un elemento. Es por eso que está fallando. Busca usar SetAttribute en el elemento .

 root.SetAttribute("name", "name goes here"); 

es el código que necesitas con lo que tienes.