如何在C#中直接读取ZIP文件中的XML文件?
在Java中,您可以传递类似“zip:zip\u file!xml\u file”的url,它将在zip文件中使用指定的xml文件。XmlUrlResolver没有此功能。有办法做到这一点吗?有一个开源的解决方案。(XmlZipResolver at的代码。)它从XmlUrlResolver继承来添加此功能 这其实很简单。XmlZipResolver类继承自XmlUrlResolver。因此,在创建XMLURLSolver对象以访问XML文件之前,您可以创建一个XmlZipResolver对象,然后将其视为XMLURLSolver对象。这适用于XMLURLSolver将使用附加代码处理的任何url,前提是url以zip:或jar开头:(Java jar文件是zip文件) 关键部分是对GetEntity的调用,它将在其中打开zip文件,然后在zip文件中获取到请求的xml文件的流。此代码使用SharpZipLib访问所有zip文件 在这之后,所有对成员函数的调用都从嵌入的xml文件流返回,这一切都非常简单。因为GetEntity()返回一个对象,如果它返回一个基本XmlUrlResolver对象,则不会调用此类中的方法。因此,所有剩余的成员函数都是专门为zip文件编写的 not的另一项是返回的流是一个包含三个对象的对象,ZipFile、作为zip文件的流和作为zip条目的流。此返回的对象继承自流。对于除Close()之外的每个调用,它只将相同的调用传递给zip条目流对象。但在关闭时(因此间接在Dispose上),它会关闭所有三个对象如何在C#中直接读取ZIP文件中的XML文件?,c#,.net,xml,zip,C#,.net,Xml,Zip,在Java中,您可以传递类似“zip:zip\u file!xml\u file”的url,它将在zip文件中使用指定的xml文件。XmlUrlResolver没有此功能。有办法做到这一点吗?有一个开源的解决方案。(XmlZipResolver at的代码。)它从XmlUrlResolver继承来添加此功能 这其实很简单。XmlZipResolver类继承自XmlUrlResolver。因此,在创建XMLURLSolver对象以访问XML文件之前,您可以创建一个XmlZipResolver对象,
同样,XmlZipResolver的代码位于。以下是我使用ICSharpCode.SharpZipLib的一些代码:
public bool Process()
{
var importFile = new FileInfo("c:\\foo\myzip.zip");
var success = true;
using (var zipStream = new ZipInputStream(importFile.OpenRead()))
{
ZipEntry theEntry;
while ((theEntry = zipStream.GetNextEntry()) != null)
{
var lowerName = theEntry.Name.ToLower();
try
{
if (lowerName.EndsWith(".xml") && !lowerName.StartsWith("__macosx"))
{
var doc = new XmlDocument();
doc.Load(zipStream);
}
}
catch (Exception e)
{
success = false;
Log.Error(string.Format("Error parsing {0} ERROR {1}",lowerName,e.Message));
}
}
}
return success;
}
这将处理zip中的每个xml文件……除了突然出现的愚蠢的Mac OsX元文件:)将推荐SharpZipLib+1 :)