1
public XmlNodeList GetNodes(string _logFilePath, string _strXPathQuery)
        {    
                    objXmlDoc = new XmlDocument();
                    objXmlDoc.Load(_logFilePath);
                    XmlNodeList objxmlNodeList = objXmlDoc.SelectNodes(_strXPathQuery);
                    return objxmlNodeList;
        }

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<AppXmlLogWritter>
<LogData>
<LogID>999992013021110381000001</LogID>
<LogDateTime>20130211103810</LogDateTime>
<LogType>Message</LogType>
<LogFlag>Flag</LogFlag>
<LogApplication>Application</LogApplication>
<LogModule>Module</LogModule>
<LogLocation>Location</LogLocation>
<LogText>Text</LogText>
<LogStackTrace>Stacktrace</LogStackTrace>
</LogData>
</AppXmlLogWritter>

ここで、xmlDocument オブジェクトに読み込むと、xml ファイルのサイズは 1000MB になり、OutOf メモリ例外が発生します。これは、XMLDocument がノードをメモリに格納するためです。Xpath クエリを使用して、xml ファイル全体でノードをフィルタリングします。XpathQueryを使用するように言われた大規模なXMLファイルの処理方法に関する記事を読みました。しかし、問題は解決しません。 ファイルストリームはどうですか?または大きなxmlファイルをロードする他のアイデアはありますか? *

4

2 に答える 2

3

XmlReaderを使用して大きな XML ファイルをチャンクで読み取るメソッドを作成できます。

データを保持するモデルを設計することから始めます。

public class LogData
{
    public string LogID { get; set; }
    public string LogDateTime { get; set; }
    public string LogType { get; set; }
    ...
}

次に、XML ファイルを解析するメソッド:

public static IEnumerable<LogData> GetLogData(XmlReader reader)
{
    LogData logData = null;
    while (reader.Read())
    {
        if (reader.IsStartElement("LogData"))
        {
            logData = new LogData();
        }
        if (reader.Name == "LogData" && reader.NodeType == XmlNodeType.EndElement)
        {
            yield return logData;
        }
        if (reader.Name == "LogID")
        {
            logData.LogID = reader.ReadElementContentAsString();
        }
        else if (reader.Name == "LogDateTime")
        {
            logData.LogDateTime = reader.ReadElementContentAsString();
        }
        else if (reader.Name == "LogType")
        {
            logData.LogType = reader.ReadElementContentAsString();
        }
        ...
    }
}

これで、表示したい要素だけを読み込むことができました。例えば:

using (var reader = XmlReader.Create("someHugeFile.xml"))
{
    IEnumerable<LogData> data = GetLogData(reader).Skip(10).Take(5);
    // Go ahead and bind the data to your UI
}

ページネーションを効果的に実装するために、XML ファイルに合計でいくつのレコードがあるかを知りたい場合もあります。これは、別の方法で行うことができます。

public static int GetTotalLogEntries(XmlReader reader)
{
    var count = 0;
    while (reader.Read())
    {
        if (reader.IsStartElement("LogData"))
        {
            count++;
        }
    }
    return count;
}
于 2013-02-11T08:16:13.430 に答える
0

ストリームに送信する前にxmlメッセージを圧縮し、もう一方の端で受信したら解凍することをお勧めします。WCFでは、次のように実行できますhttp://www.codeproject.com/Articles/165844/WCF-Client-Server-Application-with-Custom-Authenti#Compression

于 2013-02-11T08:22:20.270 に答える