DOM2级遍历和范围

DOM遍历

现有用于辅助完成顺序遍历DOM结构的类型有两个,NodeIterator和Treewalker。在于DOM兼容的浏览器中,都可以访问这两个对象,IE不支持DOM遍历,使用下列代码可以检测浏览器对DOM2级遍历的支持情况:

1 var supportTraversals = document.implementation.hasFeature('Traversal','2.0');
2 var supportNodeIterator = (typeof document.createNodeIterator == 'function');
3 var supportTreeWalker = (typeof document.createTreeWalker == 'function');

遍历是以给定节点为根,不可能向上超出DOM根节点,以下面的HTML页面为例:

 1 <html>
 2     <head>
 3         <title>遍历</title>
 4     </head>
 5     <body>
 6         <div>
 7             <p>Hello</p>
 8         </div>
 9         <span>world</span>
10     </body>
11 </html>

遍历的顺序如下:1.Document -> 2. HTML ->3.head -> 4.title ->5.Text 遍历

                                                          -> 6.body -> 7.div -> 8.p -> 9.Text Hello

                                                                         -> 10.span ->11.Text World

NodeIterator

NodeIterator可以用document.createNodeIterator()方法创建其实例,这个方法接受4个参数,分别如下:

          root: 作为搜索树的起点

          whatToShow:表示要访问哪些节点的数字代码

          filter:表示接受或拒绝某一个特定的Node

          entityReferenceExpansion:Bool变量,表示是否要扩展实体引用,在HTML中无用,直接设为false即可。

看以下示例:

1 var filter = {
2     acceptNode:function(node){
3         return node.tagName.toLowerCase() == 'p'?NodeFilter.FILTER_ACCEPT :NodeFilter.FILTER_SKIP;
4     }
5 };
6 var iterator = document.createNodeIterator(document,NodeFilter.SHOW_ELEMENT,filter,false);

这个iterator就是对页面中所有的p遍历。可以用iterator.nextNode()和iterator.previousNode()来访问各个遍历,在访问到根节点时,会返回null。

TreeWalker

TreeWalker可以说是NodeIterator的高级版本,它在前面的nextNode和previousNode以外,还提供了一系列方法,部分如下:

         parentNode():遍历到当前节点的父节点;

         firstChild():遍历到当前节点的第一个子节点;

         lastChild():遍历到当前节点的最后一个节点;

         nextsibling():遍历到当前节点的下一个同辈节点;

         perviousSibling():遍历到当前节点的前一个同辈节点;

创建TreeWalker和使用方法如下例子:

1 var filter = function(node){
2     return node.tagName.toLowerCase() == 'p'?NodeFilter.FILTER_ACCEPT :NodeFilter.FILTER_SKIP;
3 }
4 var walker = document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,filter,false);
5 var node = walker.nextNode();
6 while(node != null){
7     console.log(node.tagName.toLowerCase());
8     node = walker.nextNode();
9 }

其中,NodeIterator中的filter也可以如上的形式编写。

范围

DOM2级定义了范围接口,可以选择一个文档的一个区域,而不用考虑结点界限。可以用createRange()创建范围,在兼容DOM的浏览器中,这个是属于document,可以用hasFeature检测是否支持

1 var supportRange = document.implementation.hasFeature('Range','2.0');
2 var supportRange2 = (typeof document.createRange == 'function');

若支持,就可以用document.createRange()来创建范围了

创建范围后,就可以用selectNode()和selectNodeContents()来选择范围了,selectNode选择的是整个结点,而selectNodeContents选择的是该节点的所有子节点,以下面的HTML为例:

 1 <html>
 2     <head>
 3         <title>遍历</title>
 4     </head>
 5     <body>
 6         <div>
 7             <p>Hello</p>
 8         </div>
 9         <span>world</span>
10     </body>
11 </html>

 我们用以上的HTML创建范围:

1 var div = document.getElementsByTagName('div')[0],
2     range = document.createRange(),
3     range2 = document.createRange();
4 range.selectNode(div);
5 range2.selectNodeContents(div);

range的范围:<div><p>Hello</p></div>

range2的范围:<p>Hello</p>

当然,要创建精细复杂的选择,就可以使用setStart()和setEnd(),都接受两个参数,一个参照结点和偏移量

选择DOM范围后就需要进行DOM操作了,在操作之前,我们需要考虑一个问题,就是精细操作以后,如果我选择的是一个结点的一部分(按上个例子,我选择了<p>Hel),如果进行删除操作,那么不是文档不完整了?其实在选择范围后,在后台会动态补上缺失的标签(按刚才的会补充成<p>Hel</p><p>llo</p>),这样就可以无误的进行操作DOM了。

操作的方法有deleteContents()—删除文档区域

                 extractContents()—提取文档区域,原始的在文档中的内容会删除

                 insertNode()—向范围选取开始处插入一个节点

                 cloneContents()—复制范围对象,返回一个副本

通过这些方法,就可以简单操作DOM范围了

1 var div = document.getElementsByTagName('div')[0],
2     range = document.createRange();
3 range.selectNode(div);
4 range.deleteContents();

 

转载于:https://www.cnblogs.com/cyITtech/p/DOM_rangeAndSelect.html

### LlamaIndex 多模态 RAG 实现 LlamaIndex 支持多种数据类型的接入与处理,这使得它成为构建多模态检索增强生成(RAG)系统的理想选择[^1]。为了实现这一目标,LlamaIndex 结合了不同种类的数据连接器、索引机制以及强大的查询引擎。 #### 数据连接器支持多样化输入源 对于多模态数据的支持始于数据收集阶段。LlamaIndex 的数据连接器可以从多个异构资源中提取信息,包括但不限于APIs、PDF文档、SQL数据库等。这意味着无论是文本还是多媒体文件中的内容都可以被纳入到后续的分析流程之中。 #### 统一化的中间表示形式 一旦获取到了原始资料之后,下一步就是创建统一而高效的内部表达方式——即所谓的“中间表示”。这种转换不仅简化了下游任务的操作难度,同时也提高了整个系统的性能表现。尤其当面对复杂场景下的混合型数据集时,良好的设计尤为关键。 #### 查询引擎助力跨媒体理解能力 借助于内置的强大搜索引擎组件,用户可以通过自然语言提问的形式轻松获得所需答案;而对于更复杂的交互需求,则提供了专门定制版聊天机器人服务作为补充选项之一。更重要的是,在这里实现了真正的语义级关联匹配逻辑,从而让计算机具备了一定程度上的‘认知’功能去理解和回应人类意图背后所蕴含的意义所在。 #### 应用实例展示 考虑到实际应用场景的需求多样性,下面给出一段Python代码示例来说明如何利用LlamaIndex搭建一个多模态RAG系统: ```python from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader, LLMPredictor, PromptHelper, ServiceContext from langchain.llms.base import BaseLLM import os def create_multi_modal_rag_system(): documents = SimpleDirectoryReader(input_dir='./data').load_data() llm_predictor = LLMPredictor(llm=BaseLLM()) # 假设已经定义好了具体的大型预训练模型 service_context = ServiceContext.from_defaults( chunk_size_limit=None, prompt_helper=PromptHelper(max_input_size=-1), llm_predictor=llm_predictor ) index = GPTSimpleVectorIndex(documents, service_context=service_context) query_engine = index.as_query_engine(similarity_top_k=2) response = query_engine.query("请描述一下图片里的人物表情特征") print(response) ``` 此段脚本展示了从加载本地目录下各类格式文件开始直到最终完成一次基于相似度排序后的top-k条目返回全过程。值得注意的是,“query”方法接收字符串参数代表使用者想要询问的内容,而在后台则会自动调用相应的解析模块并结合先前准备好的知识库来进行推理计算得出结论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值