4 Stimmen

Anhängen neuer Elemente an Xml aus einem Stream

Ich habe eine Methode, die einige xml in einem Speicherstrom zurückgibt

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;
    }
}

In diesem Beispiel wird das Format der xml-Datei sein:

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

Wie kann ich ein neues Element unter der Wurzel einfügen, z.B.:

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

EDITAR:

Bitte schlagen Sie auch die effizienteste Methode zur Rückgabe einer MemoryStream ist vielleicht nicht die beste Lösung.

Die endgültige xml-Datei wird an eine benutzerdefinierte HttpHandler Was sind also die besten Optionen für das Schreiben der Ausgabe?

context.Response.Write gegen context.Response.OutputStream

3voto

John Saunders Punkte 159011

Ihr erstes Problem ist, dass Sie kein XML haben - Sie haben einen Strom von Bytes, der in eine XML-Datei geladen werden kann. XDocument o XmlDocument . Müssen Sie wirklich in einen Stream ausgeben, anstatt direkt in ein XML-Dokument?

Übrigens, ich denke, Sie sollten die using Block um den MemoryStream . Sie werden den Strom nicht mehr lange nutzen können, nachdem er entsorgt worden ist.

public void AppendElement()
{
    XDocument doc;
    using(MemoryStream stream = GetXml())
    {
        using(var sr = new StreamReader(stream))
        {
            doc = XDocument.Load(sr);
        }
    }
    if(doc.Root != null)
    {
        doc.Root.Add(new XElement("Whatever"));
    }
}

private static MemoryStream GetXml()
{
    var settings = new XmlWriterSettings {Indent = true};

    var 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;
}

Versuchen Sie aus Gründen der Effizienz, direkt mit XDocument . Sie scheinen Folgendes verwenden zu wollen XmlWriter Hier ist die Vorgehensweise (nicht getestet):

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;
}

Aktualisierung:

Sie können das XML mit

doc.Save(HttpContext.Response.Output);

Auch hier kann ich es jetzt nicht testen, aber versuchen Sie dies:

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

0voto

Anthony Pegram Punkte 119149

Überlegen Sie sich etwas wie dies

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X