2011-12-08 37 views
5

Muchas gracias de antemanointentar escribir en un archivo XML existente para C#

Este es el archivo XML original

<my:Incident> 
     <my:Category>This is for Category</my:Category> 
       <my:Status>`Status is Close`</my:Status> 
     <my:Description>`This is the description part</my:Description> 
</my:Incident> 

y me gustaría añadir otros campos bajo my:Incident

Este es un ejemplo de ello:

<my:Incident> 
     <my:Category>This is for Category</my:Category> 
       <my:Status>`Status is Close`</my:Status> 
     <my:SummaryDescription>This is the summary</my:SummaryDescription> 
     <my:Description>`This is the description part</my:Description> 
</my:Incident> 

Intenté implementar pero obtuve thi s mensaje de error:

El carácter ':', valor hexadecimal 0x3A, no se puede incluir en un nombre.

public void writerXMLTest(string fileName) 
     { 

      if (!File.Exists(fileName)) 
      { 
       XmlTextWriter writer = new XmlTextWriter(fileName, null); 
       writer.WriteStartElement("my:Incident"); 
       writer.WriteEndElement(); 
       writer.Close(); 
      } 

      XDocument doc = XDocument.Load(fileName); 
      XElement demoNode = new XElement("my:Incident"); 
      demoNode.Add(new XElement("my:SummaryDescription", "Test Test")); 


      Console.WriteLine("I write it!!!!!"); 
     } 

Le agradecería si alguien me puede guiar donde hice mal en mi código.


Modifiqué el código un poco. Pero ahora no soy capaz de escribirlo en el archivo XML existente

Este es mi código:

public void writerXMLTest(string fileName) 
     { 

      if (!File.Exists(fileName)) 
      { 
       XmlTextWriter writer = new XmlTextWriter(fileName, null); 
       writer.WriteStartElement("Incident", "my"); 
       writer.WriteEndElement(); 
       writer.Close(); 
      } 

      XDocument doc = XDocument.Load(fileName); 
      XElement demoNode = new XElement("SummaryDescription", "Test Test"); 


      Console.WriteLine("I write it!!!!!"); 
     } 

Respuesta

2

Hay varios problemas aquí. Primero, su "XML original" no es válido porque no ha definido el espacio de nombres "mi". O no nos ha mostrado todo el archivo XML, o está codificando a mano XML no válido. No hagas eso.

No puedo escribirlo en el archivo XML existente.

¿Qué significa "No puedo"? Lanza una excepción? ¿Cuál es la excepción? ¿O quiere decir que su archivo no ha cambiado después de ejecutar su código? Eso no es sorprendente porque tu código en realidad no hace nada.

XDocument doc = XDocument.Load(fileName); 

Esto carga el archivo XML desde el disco ... y luego no hace nada con él. No cambia el archivo.

XElement demoNode = new XElement("SummaryDescription", "Test Test"); 

Esto crea un nuevo elemento XML, sin relación alguna con doc, el archivo original, o para cualquier otra cosa ... y luego se tira a la basura sin hacer nada con él. No lo ha agregado a ningún lado ni ha guardado nada en un archivo.

y me gustaría añadir otros campos debajo de mi: Incidente

Si desea agregar demoNode al archivo, primero debe encontrar el Incident nodo:

XElement e = doc.Descendants(XName.Get("Incident", nameSpace)).FirstOrDefault<XElement>(); 

Agregar su nuevo elemento al:

if (e != null) 
{ 
    e.Add(new XElement(XName.Get("SummaryDescription", nameSpace), "Test Test")); 
} 

Luego guarde el cambiada documento

doc.Save(fileName); 
+0

Gracias por su ayuda. Lo resolviste :-) – yyc2001

5

Esto está mal:

writer.WriteStartElement("my:Incident"); 

Esto es correcto:

writer.WriteStartElement("Incident", "blablablaSpace:my"); 

Editar:

writer.WriteStartElement("Incident", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-09-22T20:42:56:my"); 
+0

que tipo de corregir el error, pero ahora no soy capaz de escribirlo en el archivo XML existente – yyc2001

+0

@ yyc2001 ¿Qué significa esto? Espero que no hayas usado literalmente lo que escribí :) – FailedDev

+0

@FailedDec Realmente no modifiqué mi publicación para mostrar mi código de actualización. – yyc2001

1

Su prefijo "mi:" es un espacio de nombres. Debe usar TagName = "Incident", Namespace = "my".

Cuestiones relacionadas