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

发布于 2024-10-20 05:56:27 字数 106 浏览 2 评论 0原文

在 Java 中,您可以传递类似“zip:zip_file!xml_file”的 url,它将使用 zip 文件内指定的 XML 文件。XmlUrlResolver 没有此功能。有办法做到这一点吗?

In Java you can pass a url like "zip:zip_file!xml_file" and it will use the specified XML file inside the zip file.XmlUrlResolver does not have this functionality. Is there a way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

眼眸里的快感 2024-10-27 05:56:27

这是我使用 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 元文件:)

Here is some code I have that uses 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;
    }

This processes each xml file in the zip...except for the stupid Mac OsX meta files that crop up :)

人海汹涌 2024-10-27 05:56:27

有一个开源解决方案可以解决这个问题。 (XmlZipResolver 的代码位于 xml报告。)它继承自XmlUrlResolver来添加此功能。

做到这一点实际上非常简单。 XmlZipResolver 类继承自 XmlUrlResolver。因此,在您之前创建 XmlUrlResolver 对象来访问 XML 文件的地方,您可以创建一个 XmlZipResolver 对象,然后可以将其视为 XmlUrlResolver 对象。仅当 url 以 zip: 或 jar: 开头(Java jar 文件是 zip 文件)时,这才适用于 XmlUrlResolver 将使用附加代码处理的任何 url。

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

此后,一切都非常简单,所有对成员函数的调用都从嵌入的 xml 文件流中返回。由于 GetEntity() 返回一个对象,因此如果它返回基 XmlUrlResolver 对象,则不会调用此类中的方法。因此,所有剩余的成员函数都是专门针对 zip 中的文件的情况编写的。

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

再次,XmlZipResolver 的代码位于 XML 报告

There is an open source solution to this. (Code for XmlZipResolver at xml reports.) It inherits from XmlUrlResolver to add this functionality.

It's actually pretty simple to do this. The class XmlZipResolver inherits from XmlUrlResolver. So where you before created an XmlUrlResolver object to access an XML file, you instead create an XmlZipResolver object and you can then treat it as you would an XmlUrlResolver object. And this works for any url that XmlUrlResolver will handle using the additional code only if the url starts with zip: or jar: (a Java jar file is a zip file).

The key part is on the call to GetEntity where it will open the zip file and then get a stream to the requested xml file in the zip file. This code uses SharpZipLib for all zip file access.

After this everything is pretty straightforward where all the calls to member functions return from the stream of the embedded xml file. Because GetEntity() returns an object, if it returns a base XmlUrlResolver object then the methods in this class are not called. Therefore all remaining member functions are written specifically for the case of a file in a zip.

The one other item of not is the Stream returned is an object that holds three objects, the ZipFile, the Stream that is the zip file, and the stream that is the zip entry. This returned object inherits from Stream. For every call except Close() it just passes that same call to the zip entry stream object. But on a Close (and therefore indirectly on a Dispose), it closes all three objects.

Again, code for XmlZipResolver at xml reports.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文