Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中直接读取ZIP文件中的XML文件?_C#_.net_Xml_Zip - Fatal编程技术网

如何在C#中直接读取ZIP文件中的XML文件?

如何在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对象,

在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上),它会关闭所有三个对象


同样,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 :)