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

私はプロのコーダーではありませんが、パラメーターとして axDoc.Save(stream);も取ることができることに気づいた代わりにXmlWriter、XmlReader をインスタンス化した直後に XmlWriter のインスタンスを作成してみまし た
.xDoc.Save(XmlWriter)のように:「読んだ後に書くことができません」

xDoc を正常に保存するにはどうすればよいですか?

追加: 一時フォルダーなどの他の場所にxmlファイルを保存し、その保存したファイルをzipに追加して古いファイルを上書きし、一時にxmlファイルを削除するという考えがありました..しかし、それは私がしたことではありませんしたい、zipファイルを直接扱いたい、出入りする、サードパーティなし。

4

2 に答える 2

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;
        }
    }
}
于 2012-08-07T22:22:11.980 に答える