0

我有一个包含 xml 文件的 zip 文件,我正在将此 xml 文件加载到 xml 文档中,而无需提取文件。这是通过流完成的。这样做之后,我正在修改一些节点的内部文本。问题是我在尝试保存流后遇到了前面提到的异常,这是代码:

(我在这里使用DotNetZip

ZipFile zipFile = ZipFile.Read(zipPath); // the path is my desktop
foreach (ZipEntry entry in zipFile)
{
  if (entry.FileName == "myXML.xml")
  { 
    //creating the stream and loading the xml doc from the zip file:
    Stream stream = zipFile[entry.FileName].OpenReader();    
    XmlReader xReader = XmlReader.Create(stream);
    XmlDocument xDoc = new XmlDocument();
    xDoc.Load(xReader);

    //changing the inner text of the doc nodes:
    xDoc.DocumentElement.SelectSingleNode("Account/Name").InnerText = "VeXe";
    xDoc.DocumentElement.SelectSingleNode("Account/Money").InnerText = "Million$";

    xDoc.Save(stream); // here's where I got the exception.
    break;
  }
}

我不是专业编码人员,但xDoc.Save(stream);我没有注意到它也可以将 aXmlWriter作为参数,所以我尝试在实例化 XmlReader 后立即创建 XmlWriter 的实例。
我尝试这样做:xDoc.Save(XmlWriter) 我得到了一个异常说比如:“读后不能写”

如何成功保存 xDoc?

添加: 我有一个想法将xml文件保存在其他地方,比如临时文件夹或其他东西,然后在zip中添加保存的文件覆盖旧文件,然后删除临时文件中的xml文件..但这不是我的想,我想直接处理zip文件,进出,没有第三方。

4

2 回答 2

0

快速浏览一下文档让我相信你应该这样做:

using(ZipFile zipFile = ZipFile.Read(zipPath))
foreach (ZipEntry entry in zipFile)
{
  if (entry.FileName == "myXML.xml")
  { 
    XmlDocument xDoc = new XmlDocument();
    //creating the stream and loading the xml doc from the zip file:
    using(Stream stream = zipFile[entry.FileName].OpenReader())
    using(XmlReader xReader = XmlReader.Create(stream))
    {    
        xDoc.Load(xReader);
    }
    //changing the inner text of the doc nodes:
    xDoc.DocumentElement.SelectSingleNode("Account/Name").InnerText = "VeXe";
    xDoc.DocumentElement.SelectSingleNode("Account/Money").InnerText = "Million$";

    using(var ms=new MemoryStream())
    using(var sw=new StreamWriter(ms))
    {
        xDoc.Save(sw);
        sw.Flush();
        ms.Position=0;
        zipFile.UpdateEntry(entry.FileName,ms);
    }
    break;
  }
}
于 2012-08-07T22:41:58.160 回答
0

您正在尝试写入您打开它的同一个 Stream。你不能这样做。

也许尝试这样的事情:

ZipFile zipFile = ZipFile.Read(zipPath); // the path is my desktop
foreach (ZipEntry entry in zipFile)
{
    if (entry.FileName == "myXML.xml")
    { 
        //creating the stream and loading the xml doc from the zip file:
        using (Stream stream = zipFile[entry.FileName].OpenReader()) {
            XmlReader xReader = XmlReader.Create(stream);
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(xReader);
        }

        //changing the inner text of the doc nodes:
        xDoc.DocumentElement.SelectSingleNode("Account/Name").InnerText = "VeXe";
        xDoc.DocumentElement.SelectSingleNode("Account/Money").InnerText = "Million$";

        using (StreamWriter streamWriter = new StreamWriter(pathToSaveTo)) {
            xDoc.Save(streamWriter); 
            break;
        }
    }
}
于 2012-08-07T22:22:11.980 回答