[英]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上),它會關閉所有三個對象。
以下是我使用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.