读取 zip 包中 xml 文件的内容

Posted

技术标签:

【中文标题】读取 zip 包中 xml 文件的内容【英文标题】:Read the content of an xml file within a zip package 【发布时间】:2014-12-16 16:04:00 【问题描述】:

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

我尝试使用字符串 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 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 的内容

【问题讨论】:

发帖时请多加注意格式 - 两个代码 sn-ps 都适用于第一行,但其他所有内容都缩进了太多。在提交之前使用预览确保您的帖子看起来不错。 【参考方案1】:

您的部分代码 sn-p 失败,因为当您到达第一个 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 语句的结尾之前读取的。

【讨论】:

谢谢乔恩。由于在阅读内容之前已处理流,我收到了错误消息。它确实有效。 谢谢乔恩。由于在阅读内容之前已处理流,我收到了错误消息。它确实有效。 您可以将两个usings 顺序放置,而无需打开using (Stream stream = entry.Open()) 之后的代码块。我相信我在 MSDN 的某处看到这是使用 usings 的推荐方式。 @hellouworld:这是一个选项,但我不确定我是否会说它是推荐的。从 C# 8 开始,您可以使用完全不带任何大括号的语句编写“裸”语句,这些语句隐含“到当前块的末尾”,这将使其更简单。 不知道。谢谢。【参考方案2】:

以下是如何使用 .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;
        
    

【讨论】:

以上是关于读取 zip 包中 xml 文件的内容的主要内容,如果未能解决你的问题,请参考以下文章

读取aws lambda包中的打包文件

linux如何删除zip包中某个文件夹及里面的内容

EXCEL 数据透视表 不可读取

使用 Python 直接从 zip 文件中读取 xml 文件

从 zip 文件中读取的 XML 文件中删除空格

java 解压缩之后文件内容读取