阅读zip包中的xml文件的内容

时间:2014-12-16 16:04:01

标签: c# zipfile

我需要使用Stream读取.xml文件的内容(此处xml文件存在于zip包中)。在下面的代码中,我需要在运行时获取文件路径(这里我已经硬编码了路径以供参考)。请让我知道如何在运行时读取文件路径。

我试过使用string s = entry.FullName.ToString();但得到错误“无法找到路径”。我还试图对路径进行硬编码,如下所示。但是得到相同的FileNotFound错误。

string metaDataContents;
using (var zipStream = new FileStream(@"C:\OB10LinuxShare\TEST1\Temp" + "\\"+zipFileName+".zip", FileMode.Open))
using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Read))
{
    foreach (var entry in archive.Entries)
    {
        if (entry.Name.EndsWith(".xml"))
        {
            FileInfo metadataFileInfo = new FileInfo(entry.Name);
            string metadataFileName = metadataFileInfo.Name.Replace(metadataFileInfo.Extension, String.Empty);
            if (String.Compare(zipFileName, metadataFileName, true) == 0)
            {
                using (var stream = entry.Open())
                using (var reader = new StreamReader(stream))
                {
                    metaDataContents = reader.ReadToEnd();
                    clientProcessLogWriter.WriteToLog(LogWriter.LogLevel.DEBUG, "metaDataContents : " + metaDataContents);
                }
            }
        }
    }
}

我还尝试使用Stream对象获取.xml文件的内容,如下所示。但在这里我得到错误“Stream不可读”。

Stream metaDataStream = null;
string metaDataContent = string.Empty;
using (Stream stream = entry.Open())
{                                
    metaDataStream = stream;
}
using (var reader = new StreamReader(metaDataStream))
{
    metaDataContent = reader.ReadToEnd();
}

请建议,如何使用Stream和StreamReader在zip文件中通过在运行时指定文件路径来读取xml的内容

2 个答案:

答案 0 :(得分:4)

您的部分代码段失败,因为当您到达第一个using语句的末尾时:

using (Stream stream = entry.Open())
{                                
    metaDataStream = stream;
}

......将丢弃流。这是using声明的要点。你可以使用这个 sort 代码,但在流打开时加载XML文件:

XDocument doc;
using (Stream stream = entry.Open())
{                                
    doc = XDocument.Load(stream);
}

将其加载为XML ...如果您真的只想要文本,可以使用:

string text;
using (Stream stream = entry.Open())
{                                
    using (StreamReader reader = new StreamReader(stream)
    {
        text = reader.ReadToEnd();
    }
}

同样,不是在之前读取它是如何在任何using语句结束时读取

答案 1 :(得分:1)

以下是如何使用.net 4.5

读取zip文件的示例
private void readZipFile(String filePath)
    {
        String fileContents = "";
        try
        {
            if (System.IO.File.Exists(filePath))
            {
                System.IO.Compression.ZipArchive apcZipFile = System.IO.Compression.ZipFile.Open(filePath, System.IO.Compression.ZipArchiveMode.Read);
                foreach (System.IO.Compression.ZipArchiveEntry entry in apcZipFile.Entries)
                {
                        if (entry.Name.ToUpper().EndsWith(".XML"))
                        {
                            System.IO.Compression.ZipArchiveEntry zipEntry = apcZipFile.GetEntry(entry.Name);

                            using (System.IO.StreamReader sr = new System.IO.StreamReader(zipEntry.Open()))
                            {
                                //read the contents into a string
                                fileContents = sr.ReadToEnd();
                            }

                        }
                }


            }
        }
        catch (Exception)
        {

            throw;
        }
    }