2011-03-06 89 views

回答

4

有一个开源的解决方案。 (代码为XmlZipResolver,在xml reports。)它从XmlUrlResolver继承来添加此功能。

这样做其实很简单。 XmlZipResolver类继承自XmlUrlResolver。因此,在创建XmlUrlResolver对象以访问XML文件之前,您需要创建一个XmlZipResolver对象,然后您可以像对待XmlUrlResolver对象那样对待它。而且这适用于XmlUrlResolver仅在URL以zip开头时才使用附加代码处理的任何URL:或jar :(Java jar文件是zip文件)。

关键部分是调用GetEntity,它将打开zip文件,然后在zip文件中获取所请求的xml文件的流。此代码使用SharpZipLib进行所有zip文件访问。

之后,所有对成员函数的调用都从嵌入式xml文件流中返回,这一切都非常简单。因为GetEntity()返回一个对象,如果它返回一个基本的XmlUrlResolver对象,那么这个类中的方法不会被调用。因此,所有其余的成员函数都是专门为zip文件中的文件编写的。

另一个不是的项目是返回的Stream是一个对象,它包含三个对象ZipFile,作为zip文件的Stream以及作为zip条目的流。此返回的对象从Stream继承。对于除Close()之外的每个调用,它只是将相同的调用传递给zip条目流对象。但是在Close上(因此间接在Dispose上),它会关闭所有三个对象。

再次,XmlZipResolver的代码为xml reports

4

下面是一些代码,我有一个使用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; 
    } 

这种处理每个XML文件中的拉链......除了那突然出现:)

+0

愚蠢的MAC OSX元文件准备推荐SharpZipLib。 +1 :) – Roloc 2011-03-06 01:19:50