将上载的xml文件加载到XmlDocument对象中

时间:2010-07-27 11:13:23

标签: c# asp.net asp.net-mvc

无论如何,我正在尝试从浏览器上传文件,然后将其读入服务器上的XmlDocument对象。最初我通过将文件保存到磁盘,将其读入XmlDocument对象然后删除文件来解决此问题。唯一的问题是删除操作是在XmlDocument.Load操作完成之前尝试进行的。 无论如何,这感觉就像一个丑陋的解决方案,所以很高兴放弃它。

接下来的努力是直接从Request.Files[x].InputStream直接读到XmlDocument,但我遇到了问题。 以下代码失败,带有

  

'根元素缺失'

我知道XML是有效的,所以它必须是别的东西。

foreach (string file in Request.Files) 
{
    HttpPostedFileBase postedFile = Request.Files[file] as  HttpPostedFileBase;

    if (postedFile.ContentLength > 0) //if file not empty
    {
       //create an XML object and load it in
        XmlDocument xmlProjPlan = new XmlDocument();

        Stream fileStream = postedFile.InputStream;
        byte[] byXML = new byte[postedFile.ContentLength];
        fileStream.Read(byXML, 0, postedFile.ContentLength);
        xmlProjPlan.Load(fileStream);
     }
}

2 个答案:

答案 0 :(得分:9)

以下是一个例子:

<% using (Html.BeginForm("index", "home", FormMethod.Post, new { enctype = "multipart/form-data" })) { %>
    <input type="file" name="file" />
    <input type="submit" value="Upload" />
<% } %>

控制器动作:

[HttpPost]
public ActionResult Index(HttpPostedFileBase file)
{
    if (file != null && file.ContentLength > 0 && file.ContentType == "text/xml")
    {
        var document = new XmlDocument();
        document.Load(file.InputStream);
        // TODO: work with the document here
    }
    return View();
}

答案 1 :(得分:4)

所以有些事情看起来不对。

fileStream.Read(byXML, 0, postedFile.ContentLength); 

这一行将文件读入byXML字节缓冲区,但是你以后没有使用这个字节缓冲区,所以我认为你的意思是删除这一行或者使用byXML缓冲区来代替你的XmlDocument.Load()

不幸的是,这条线路将您的信息流推进到最后,所以当您致电

xmlProjPlan.Load(fileStream); 

它没有任何结果,因为流已经结束了。这可能就是它无法找到根元素的原因。