Как я могу напрямую прочитать XML-файл в ZIP-файл в C #? - PullRequest
2 голосов
/ 06 марта 2011

В Java вы можете передать URL, например, «zip: zip_file! Xml_file», и он будет использовать указанный XML-файл внутри zip-файла. XmlUrlResolver не имеет этой функциональности. Есть ли способ сделать это?

Ответы [ 2 ]

4 голосов
/ 06 марта 2011

Вот мой код, который использует 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-файл в zip-архиве ... за исключением глупых метафайлов Mac OsX, которые возникают :)

4 голосов
/ 06 марта 2011

Существует решение с открытым исходным кодом для этого.(Код для XmlZipResolver на xml сообщает .) Он наследуется от XmlUrlResolver для добавления этой функциональности.

На самом деле это довольно просто сделать.Класс XmlZipResolver наследуется от XmlUrlResolver.Таким образом, если вы ранее создали объект XmlUrlResolver для доступа к XML-файлу, вы вместо этого создаете объект XmlZipResolver, а затем можете обрабатывать его так же, как объект XmlUrlResolver.И это работает для любого URL, который XmlUrlResolver будет обрабатывать с использованием дополнительного кода, только если URL начинается с zip: или jar: (файл jar Java является файлом zip).

Ключевая часть находится в вызовеGetEntity, где он откроет zip-файл, а затем получит поток в запрошенный xml-файл в zip-файле.Этот код использует SharpZipLib для доступа ко всем файлам zip.

После этого все довольно просто, когда все вызовы функций-членов возвращаются из потока встроенного XML-файла.Поскольку GetEntity () возвращает объект, если он возвращает базовый объект XmlUrlResolver, то методы в этом классе не вызываются.Поэтому все остальные функции-члены написаны специально для случая файла в zip-файле.

Еще один элемент, который не является возвращаемым потоком, - это объект, который содержит три объекта, ZipFile, поток, который являетсяzip-файл и поток, который является zip-записью.Этот возвращенный объект наследуется от Stream.Для каждого вызова, кроме Close (), он просто передает тот же вызов объекту потока zip-записи.Но при закрытии (и, следовательно, косвенно при утилизации) он закрывает все три объекта.

Опять же, код для XmlZipResolver в xml сообщает .

...