4

だから私は巨大な XML ファイル (ウィキペディア ダンプ xml) を持っています。

私の学校のプロジェクトの要件では、この xml ファイルを非常に高速に検索できる必要があるとされています (いいえ、SQL データベースにインポートしないでください)。

もちろん、別のファイル (おそらく xml ) に表示されるインデクサーを作成したいと思います: [検索するコンテンツ]:[コンテンツを含む xml ノードの開始位置までのバイト オフセット]

私の質問は、要素の位置を取得する方法と、検索に必要な場合に xml 内のその位置にジャンプする方法です。

プロジェクトは C# です。前もって感謝します。

後で編集: XmlReader を使用しようとしていますが、他の提案は受け付けています。

今のところ、これはインデックスなしの検索で XML を読み取る方法です

XmlReader reader = XmlReader.Create(FileName);

while (reader.Read())
{
    switch (reader.Name)
    {
        case "page":

            Boolean found = false;
            String title = "";
            String element = "<details>";
            readMore(reader, "title");
            title = reader.Value;

            if (title.Contains(word))
            {
                found = true;
            }
            readMore(reader, "text");
            String content = reader.Value;
            if (content.Contains(word) & !found)
            {
                found = true;
            }
            if (found)
            {
                element += "<summary>" + title + " (click)</summary>";
                element += content;
                element += "</details>";
                result.Add(element);
            }

            break;
    }
}
reader.Close();
if (result.Count == 0)
{
    result.Add("No results were found");
}
return result;

…

static void readMore(XmlReader reader, String name)
{
    while (reader.Name != name)
    {
        reader.Read();
    }
    reader.Read();
}
4

1 に答える 1

0

正しい解決策は、中間バイナリ形式を使用することです。しかし、それができず、DOM を使用していると仮定すると、ノードの位置を DOM ツリーにインデックスのリストとして保存する以外に解決策はありません。

JavaScript での例 (C# でもほぼ同じはずです):

function getPosition(node) {
  var pos = [], i = 0;
  while (node != document.documentElement) {
    if (node.previousSibling) {
      ++i;
      node = node.previousSibling;
    } else {
      pos.unshift(i);
      i = 0;
      node = node.parentNode;
    }
  }

  return pos;
}

function getNode(pos) {
  var node = document.documentElement;
  for (var i = 0; i < pos.length; ++i) {
    node = node.childNodes[pos[i]];
  }

  return node;
}
于 2012-11-16T09:10:01.283 に答える