读取 zip 包中 xml 文件的内容
本文关键字:文件 xml zip 包中 读取 | 更新日期: 2023-09-27 18:34:31
我需要使用 Stream 读取.xml文件的内容(这里的 xml 文件存在于 zip 包中(。在下面的代码中,我需要在运行时获取文件路径(这里我硬编码了路径以供参考(。请让我知道如何在运行时读取文件路径。
我尝试使用字符串 s =entry。FullName.ToString((;但收到错误"找不到路径"。我还尝试对路径进行硬编码,如下所示。但是得到相同的文件未找到错误。
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();
}
请建议,如何在运行时指定文件路径,使用流和流阅读器在zip文件中读取xml的内容
您的部分代码段失败,因为当您到达第一个 using
语句的末尾时:
using (Stream stream = entry.Open())
{
metaDataStream = stream;
}
。流将被释放。这就是using
声明的重点。您应该可以使用此类代码,但在流打开时加载 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
语句的末尾之前是如何阅读的。
下面是如何使用 .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;
}
}