Vikas
Vikas

Reputation: 24322

How can I make downloadable file created by XmlDocument()

I have created a file with

XmlDocument xmldoc = new XmlDocument();

Can I make this file as downloadable? without saving it?

Upvotes: 3

Views: 1961

Answers (5)

Noldorin
Noldorin

Reputation: 147270

You'll want to look at writing a Custom HTTP Handler (a class that implements IHttpHandler) and simply register it in web.config. See this article on MSDN for a good example of how to set one up.

Here's a basic example of how you might go about implementing one to return the markup for an XmlDocument.

using System.Web;

public class MyXmlDocumentHandler : IHttpHandler
{
    public static XmlDocument XmlDoc
    {
        get;
        set;
    }

    public MyXmlDocumentHandler()
    {
    }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/xml"; // Set the MIME type.
        XmlDoc.WriteTo(context.Response.OutputStream); // Write the XML markup to the respone stream.
    }

    public bool IsReusable
    {
        // To enable pooling, return true here.
        // This keeps the handler in memory.
        get { return false; }
    }
}

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1500185

You'll need to respond to a request for it, saving the document to the response. Of course, you'll need to be able to get the XmlDocument somehow - if you've created it in one request (e.g. for a page) you'll need to either be able to recreate it based on parameters, of cache it in the session (with all the normal caveats).

For an example of writing it out, within a normal Page you might do:

xmldoc.Save(Response.OutputStream);

or

xmldoc.Save(Response.Output);

You can easily create a .ashx file and associated code-behind (new "Generic Handler" item) and then in the code-behind which implements IHttpHandler implement ProcessRequest with:

public void ProcessRequest(HttpContext context)
{
    XmlDocument doc = ...;

    doc.Save(context.Response.OutputStream);
}

You may also want to set an appropriate content type (probably "text/xml" unless it's a specific XML format which you'd want to be interpreted differently) etc. If you want the client to default to saving it, you should set a content disposition.

Upvotes: 1

Paulo Santos
Paulo Santos

Reputation: 11567

Differently from what Noldorin posted you don't have to create a Custom HTTP Handler.

If you want to download the XML document created by the XmlDocument class, you can always save it directly to the stream, setting its content type to text/xml.

More or less like the following code:

XmlDocument xmldoc = new XmlDocument();

/*
 * ... more code ...
 */

this.Response.ContentType = "text/xml";

xmldoc.Save(this.Response.OutputStream);

Upvotes: 0

Kev
Kev

Reputation: 119806

You could do something like:

XmlDocument doc = new XmlDocument();
doc.LoadXml(@"<xml>myxml</xml>");
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment;filename=MyXmlDocument.xml");
Response.AddHeader("Content-Length", doc.OuterXml.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.Write(doc.OuterXml);

Upvotes: 3

Robert Koritnik
Robert Koritnik

Reputation: 105029

This is how:

xmldoc.Save(Response.OutputStream)

Don't forget to set response mime type and other relevant properties so client browser will understand it as a file download.

Upvotes: 1

Related Questions