XML取一个元素的位置,并在下一次使用时直接进入

时间:2012-11-16 08:44:51

标签: c# xml wikipedia

所以我有一个巨大的XML文件(wikipedia dump xml)。

我的学校项目要求说我应该能够对这个xml文件进行非常快速的搜索(所以不要,不要将它导入到sql数据库中)

所以当然我想创建一个索引器,它将显示为一个单独的文件(可能是xml),如下所示:[要搜索的内容]:[包含内容的xml节点开头的字节偏移量] < / p>

我的问题是如何获取元素的位置,如果搜索需要,我如何跳转到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();
}

1 个答案:

答案 0 :(得分: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;
}