2010-03-20 4 views
4

J'ai une méthode qui retourne un peu xml dans un flux de mémoireComment ajouter de nouveaux éléments à Xml d'un flux

private MemoryStream GetXml() 
{ 
    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.Indent = true; 

    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
     using (XmlWriter writer = XmlWriter.Create(memoryStream, settings)) 
     { 
      writer.WriteStartDocument(); 
      writer.WriteStartElement("root"); 
      writer.WriteStartElement("element"); 
      writer.WriteString("content"); 
      writer.WriteEndElement(); 
      writer.WriteEndElement(); 
      writer.WriteEndDocument(); 
      writer.Flush(); 
     } 

     return memoryStream; 
    } 
} 

Dans cet exemple, le format du fichier XML sera:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <element>content</element> 
</root> 

Comment puis-je insérer un nouvel élément sous la racine par exemple:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <element>content</element> 
    ----->New element here <------ 
</root> 

EDIT:

Aussi s'il vous plaît suggérer la méthode la plus efficace que le retour d'un MemoryStream peut ne pas être la meilleure solution. Le xml final sera passé à un HttpHandler personnalisé, alors quelles sont les meilleures options pour l'écriture de la sortie?

context.Response.Write vs context.Response.OutputStream

Répondre

3

Votre première question est que vous n'avez pas XML - vous avez un flux d'octets qui peuvent être chargés dans un XDocument ou XmlDocument. Avez-vous vraiment besoin de générer un flux plutôt que directement dans un document XML? Par ailleurs, je pense que vous devez perdre le bloc using autour de MemoryStream. Vous ne serez pas en mesure d'utiliser le flux pour beaucoup après qu'il a été éliminé. Pour des raisons d'efficacité, essayez de travailler directement avec XDocument. Vous semblez vouloir utiliser XmlWriter, voici donc comment le faire (non testé):

public void AppendElement() 
{ 
    XDocument doc = GetXml(); 
    if(doc.Root != null) 
    { 
     doc.Root.Add(new XElement("Whatever")); 
    } 
} 

private static XDocument GetXml() 
{ 
    var doc = new XDocument(); 

    using (XmlWriter writer = doc.CreateWriter()) 
    { 
     writer.WriteStartDocument(); 
     writer.WriteStartElement("root"); 
     writer.WriteStartElement("element"); 
     writer.WriteString("content"); 
     writer.WriteEndElement(); 
     writer.WriteEndElement(); 
     writer.WriteEndDocument(); 
     writer.Flush(); 
    } 

    return doc; 
} 

Mise à jour:

Vous pouvez écrire le XML avec

doc.Save(HttpContext.Response.Output); 

Encore une fois, je ne peux pas le tester maintenant, mais essayez ceci:

private static XDocument GetXml() 
{ 
    return new XDocument(
     new XElement(
      "root", 
      new XElement(
       "element", 
       "content"))); 
} 
+0

En effet je pourrais retourner un XDocument si cela fait qu'il est plus facile d'injecter des éléments supplémentaires. Pas vraiment sûr de ce qui est le mieux pour garder les frais généraux bas. D'où ma raison initiale de retourner un flux. –

+0

Votre dernière édition (statique XDocument GetXml()) est en fait comme quelque chose que je viens d'écrire et de tester, alors oui, cela fonctionne. Bon travail. –

0

Tenir compte quelque chose comme ça

XElement element = XElement.Parse(@" <root> 
             <element>content</element> 
            </root>"); 

element.Element("element").AddAfterSelf(new XElement("foo", "blah")); 
Questions connexes