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