C# XML占据元素的位置,在下一次使用时直接转到那里

C# XML占据元素的位置,在下一次使用时直接转到那里,c#,xml,wikipedia,C#,Xml,Wikipedia,所以我有一个巨大的XML文件(维基百科转储XML) 我的学校项目要求我应该能够对这个xml文件进行非常快速的搜索(所以不,不要将它导入sql数据库) 因此,我当然想创建一个索引器,它将显示在一个单独的文件(可能是xml)中,如下所示:[要搜索的内容]:[包含内容的xml节点开始的字节偏移量] 我的问题是如何确定元素的位置,以及如何在xml中跳转到该位置,以防搜索需要该位置 该项目是在C#。先谢谢你 稍后编辑:我正在尝试使用XmlReader,但我愿意接受任何其他建议 目前,这是我读取XML进行非

所以我有一个巨大的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();
}
XmlReader=XmlReader.Create(文件名);
while(reader.Read())
{
开关(reader.Name)
{
案例“第页”:
布尔值=false;
字符串标题=”;
字符串元素=”;
readMore(读者,“标题”);
title=reader.Value;
if(标题包含(单词))
{
发现=真;
}
readMore(读者,“文本”);
字符串内容=reader.Value;
if(content.Contains(word)&!found)
{
发现=真;
}
如果(找到)
{
元素+=“”+标题+“(单击)”;
元素+=含量;
元素+=“”;
结果:添加(元素);
}
打破
}
}
reader.Close();
如果(result.Count==0)
{
结果。添加(“未发现任何结果”);
}
返回结果;
…
静态void readMore(XmlReader,字符串名称)
{
while(reader.Name!=Name)
{
reader.Read();
}
reader.Read();
}

正确的解决方案是使用中间二进制格式;但是如果您不能做到这一点,并且假设您使用DOM,我看不到任何解决方案,只能将节点在DOM树中的位置存储为索引列表

JavaScript中的示例(应与C#中的示例完全相同):

函数getPosition(节点){ var pos=[],i=0; while(节点!=document.documentElement){ if(节点上一个同级){ ++一,; node=node.previousSibling; }否则{ 取消移位位置(i); i=0; node=node.parentNode; } } 返回pos; } 函数getNode(pos){ var节点=document.documentElement; 对于(变量i=0;i
您自己尝试过任何东西吗?如果是的话,您可以发布一些代码吗?您是否对被索引文本部分的XML结构有一些保证?只有文本,有效的XML片段,…您真的不应该像您那样将XML构建为字符串。如果生成的XML也很大,请使用
XDocument
(或
XmlDocument
)或
XmlWriter
。我认为您需要修改您的索引想法:不要按“字节”索引,也不要按节点号索引(因此这是从Julien Royer那里得到的想法:但不要使用DOM—构建流处理器(java中的SAX—我不确定C中的SAX)这不会将整个输入文档保存在内存中。也许您可以基于简化的“XPATH”语法编制索引,例如:/root/title[0]/段落[5][以唯一标识节点]和搜索关键字列表。(或相反)。但是DOM不会将整个XML加载到内存中吗?我负担不起,因为我的测试XML有1GB,应用程序应该运行的XML接近40GB。那么DOM确实不是一个选项…
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;
}