簡體   English   中英

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

[英]How can I directly read an XML file in a ZIP file in C#?

在Java中,您可以傳遞類似“zip:zip_file!xml_file”的URL,它將使用zip文件中的指定XML文件.XmlUrlResolver沒有此功能。 有沒有辦法做到這一點?

有一個開源解決方案。 xml報告中的 XmlZipResolver代碼。)它繼承自XmlUrlResolver以添加此功能。

實際上這很簡單。 XmlZipResolver類繼承自XmlUrlResolver。 因此,在創建XmlUrlResolver對象以訪問XML文件之前,您可以創建一個XmlZipResolver對象,然后可以像處理XmlUrlResolver對象一樣對待它。 這適用於XmlUrlResolver僅在url以zip:或jar:(Java jar文件是zip文件)開頭時才使用附加代碼處理的任何URL。

關鍵部分是調用GetEntity,它將打開zip文件,然后獲取zip文件中所請求的xml文件的流。 此代碼使用SharpZipLib進行所有zip文件訪問。

在此之后,一切都非常簡單,所有對成員函數的調用都從嵌入式xml文件的流中返回。 因為GetEntity()返回一個對象,如果它返回一個基本的XmlUrlResolver對象,則不會調用此類中的方法。 因此,所有剩余的成員函數都是專門針對zip文件的情況編寫的。

返回的另一項是返回的Stream是一個包含三個對象的對象,ZipFile,作為zip文件的Stream,以及作為zip條目的流。 此返回的對象繼承自Stream。 對於除Close()之外的每個調用,它只是將相同的調用傳遞給zip條目流對象。 但是在關閉(因此間接在Dispose上),它會關閉所有三個對象。

同樣, xml的 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元文件:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM