多くのデータ (今は不要) と非常に多くの手順を含む大きな xml ファイルがあります。最後までxmlを読んで最後の手続きをしたい。(最後の START PROCEDURE から最後の END PROCEDURE まで、およびそれらの間のすべて)
最初から試してみましたが、すべてのデータを取得するのに時間がかかりすぎて効率的ではなく、次の手順が見つかるまで各手順を最後に実行します。
また、配列に格納されている行ごとの読み取りを試みましたが、for ループを使用して最後から検索を開始しましたが、これにも時間がかかります。
getElementByTagName も役に立ちません。多くの開始および終了プロシージャがあり、それらすべてを実行する必要がある場合はあまり効率的ではないからです。
xml ファイルの形式は次のとおりです。
.............
.............
.............
<value>
<struct>
<member>
<name> procedureAction </name>
<value> 0 </value>
</member>
<member>
<name> mainType </name>
<value> 200 </value>
</member>
<member>
<name> subType </name>
<value> 30 </value>
</member>
<member>
<name> time </name>
<value> 1890 </value>
</member>
</struct>
</value>
.................
.................
.................
..................
<value>
<struct>
<member>
<name> procedureAction </name>
<value> 1 </value> </member>
<member>
<name> mainType </name>
<value> 200 </value>
</member>
<member>
<name> subType </name>
<value> 30 </value>
</member>
<member>
<name> time </name>
<value> 1890 </value>
</member>
</struct>
</value>
.............
.............
.............
procedureAction の値 0 は START であり、procedureAction の値 1 は END です。
xml ファイルを最後から読むにはどうすればよいですか? 固定サイズのエンコーディングが必要なため、反復子は機能しません。
前もって感謝します。
「procedureAction」要素名が見つかると、procedureSearch 関数は xml を分割し、その部分を配列内の位置に保存します。これは、procedureAction を含むすべての行に対して行われます。配列の最後の「procedureAction 値 0」を検索しようとしましたが、時間がかかりすぎます `private string[] procedureSearch(string inputXmlAsString){
string[] returnValue = null;
string[] split;
string startSplit = "<value><struct><member><name>procedureAction</name><value>";
string stopSplit = "</value></member></struct></value><value>";
const int MAX_COUNT = 100000;
string[] allResults = new string[MAX_COUNT];
int allResultsCounter = 0;
while (inputXmlAsString.CompareTo("") == 1) {
if (inputXmlAsString.Contains(startSplit)) {
//if the text is contained in the remaining log...
//split at the start (throw the split[0], keep split[1])
split = inputXmlAsString.Split(new string[] { startSplit }, StringSplitOptions.RemoveEmptyEntries);
string[] tempSplitter = null;
//gather the remaining
inputXmlAsString = string.Join(startSplit, split.Skip(1).ToList());
//and split the remaining at the stop
tempSplitter = inputXmlAsString.Split(new string[] { stopSplit }, StringSplitOptions.RemoveEmptyEntries);
//connect from the start to the stop
allResults[allResultsCounter] = startSplit + tempSplitter[0];
string tempComp = stopSplit;
tempSplitter = tempComp.Split(new String[] { "<value" }, StringSplitOptions.RemoveEmptyEntries);
allResults[allResultsCounter] += tempSplitter[0];
allResultsCounter++;
} else {
inputXmlAsString = "";
}//if substring exists
//Console.WriteLine("ReadLog after if: "+ readLog);
}//while readLog not null
returnValue = new string[allResultsCounter];
for (int b = 0; b < allResultsCounter; b++) {
returnValue[b] = allResults[b];
}//for
return returnValue;
}//end of procedureSearch function`
主なものは非常に単純です:
string pieceOfXml = System.IO.File.ReadAllText(logPath);
const int MAX = 100000;
string[] allProcedures = new string[MAX];
int allProceduresCounter = 0;
allProcedures = procedureSearch(pieceOfXml);
結果は、ほぼ 3000 行の配列です。
<value><struct><member><name>procedureAction</name><value>20</value></member>
<member><value><struct><member><name>mainType</name><value>31</value></member>
<member><name>subType</name><value>0</value></member></struct></value></member>
<member><name>time</name><value>97</value></member></member></struct></value>