我有一个包含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);
代替XmlWriter
而不是xDoc.Save(XmlWriter)
作为参数,因此我在实例化XmlReader后立即尝试制作XmlWriter的实例..
我试过这样做:{{1}}
我有一个例外,上面写着:“读后不能写”
如何成功保存xDoc?
增加: 我有一个想法是将xml文件保存在其他地方,比如临时文件夹或其他东西 然后在zip中添加保存的文件覆盖旧文件,然后删除临时文件中的xml文件。 但这不是我想要的,我想直接处理zip文件,进出,没有第三方。
答案 0 :(得分:0)
您正在尝试写入您已打开的相同信息流。你不能这样做。
也许尝试这样的事情:
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;
}
}
}
答案 1 :(得分:0)
快速look at the docs让我相信你应该这样做:
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;
}
}