2008-10-07 9 views
25

Tengo un XmlDocument que ya existe y se lee de un archivo.Adjuntar bloque de cadena XML a XmlDocument existente

Me gustaría agregar un trozo de Xml a un nodo en el documento. ¿Hay una buena manera de crear y agregar todos los nodos sin saturar mi código con muchas llamadas a .CreateNote y .AppendChild?

Me gustaría alguna forma de hacer un string o stringBuilder de una sección Xml válida y simplemente anexar eso a un XmlNode.

ejemplo: xmlDoc original:

<MyXml> 
    <Employee> 
    </Employee> 
</MyXml> 

y, quisiera añadir un demográfica (con varios hijos) la etiqueta con el empleado:

<MyXml> 
    <Employee> 
     <Demographic> 
     <Age/> 
     <DOB/> 
     </Demographic> 
    </Employee> 
</MyXml> 

Respuesta

71

sugiere emplear XmlDocument.CreateDocumentFragment si usted tiene la datos en cadenas de forma libre. Todavía tendrá que usar AppendChild para agregar el fragmento a un nodo, pero tiene la libertad de construir el XML en su StringBuilder.

XmlDocument xdoc = new XmlDocument(); 
xdoc.LoadXml(@"<MyXml><Employee></Employee></MyXml>"); 

XmlDocumentFragment xfrag = xdoc.CreateDocumentFragment(); 
xfrag.InnerXml = @"<Demographic><Age/><DOB/></Demographic>"; 

xdoc.DocumentElement.FirstChild.AppendChild(xfrag); 
+2

Corto y al punto ... excelente! +1 – tigerswithguitars

+0

Excelente solución – Nirman

+0

¿Qué ocurre si hay comillas (") como en los atributos en el fragmento? – Raulp

11

Prueba esto:

employeeNode.InnerXml = "<Demographic><Age/><DOB/></Demographic>"; 

alternativa (si tiene otro documento XML que desea utilizar):

employeeNode.AppendChild(employeeNode.OwnerDocument.ImportNode(otherXmlDocument.DocumentElement, true)); 
2

Considere el uso de un XmlWriter para la construcción de sus fragmentos en un StringBuilder ya que esto le proporcionará validación y sustitución de caracteres.

+0

@ffpf: +1 buen consejo, pero los espacios de nombres y XmlWriter siempre me hacen retroceder a MSDN. – user7116

6

Como alternativa, esta es la forma en que podría hacerlo de una manera más LINQy 3,5 manera:

XDocument doc = XDocument.Load(@"c:\temp\test.xml"); 
XElement demoNode = new XElement("Demographic"); 
demoNode.Add(new XElement("Age")); 
demoNode.Add(new XElement("DOB")); 
doc.Descendants("Employee").Single().Add(demoNode); 
doc.Save(@"c:\temp\test2.xml"); 
0

Todo lo que hago es crear un nuevo objeto de conjunto de datos y abra el archivo XML usando ReadXML myDataset.ReadXML(path and file name).

A continuación, agregue o elimine las filas que necesito y guarde el documento nuevamente usando myDataset.WriteXML(path and file name).

Adiós.

0

Nada de esto me funcionaba, así que jugué abit y esta es mi solución.

Primero cargue un campo de texto (puede ponerlo a visible = falso en la versión pública) cargue los datos en el campo de texto como tal.

string Path = Directory.GetCurrentDirectory() + "/2016"; 
      string pathFile = Path + "/klanten.xml"; 
      StreamReader sr = new StreamReader(pathFile); 
      txt.Text = sr.ReadToEnd(); 
      sr.Close(); 

en el botón Guardar cargar el campo de texto en guardarlo. No olvide que tendrá que actualizar el campo de texto después de eso, si desea agregar varias direcciones/nombres, no he incluido esa parte.

string name = Globals.s_Name; 
     string klanten = txt.Text; 
     string s = klanten; 
     XmlDocument xdoc = new XmlDocument(); 

     string klant = "<voornaam>" + naamBox1.Text + "</voornaam>"; 
     xdoc.LoadXml(s); 
     XmlDocumentFragment xfrag = xdoc.CreateDocumentFragment(); 
     xfrag.InnerXml = klant; 
     xdoc.DocumentElement.FirstChild.AppendChild(xfrag); 
     xdoc.Save(name + "/klanten.xml"); 
Cuestiones relacionadas