大家都知道,Solr是一个基于Lucene高可配置的搜索服务器,大部分参数值以及相关优化等等都可以在solrconfig.xml中配置,那么就需要一个能够很快的进行解析和读取配置文件内容的数据结构,为此Solr提供了NamedList结构。

NamedList,一个有序的name/value容器,NamedList不像Map,他具有以下特点:

1、名字可以重复

2、NamedList中的element保持这有序状态

3、可以下标的形式访问Elements

4、name和value都可以为null

NamedList中通过下边访问要快于通过name访问。

NamedList在org.apache.solr.common.util包下面,把配置文件转换成NamedList需要另外两个辅助类DOMUtil和StrUtils, NamedList支持集中简单的数据类型,这个可以在DOMUtil的代码中可以看出,如下:

@SuppressWarnings("unchecked")
public static void addToNamedList(Node nd, NamedList nlst, List arr) {
// Nodes often include whitespace, etc... so just return if this
// is not an Element.
if (nd.getNodeType() != Node.ELEMENT_NODE) return; String type = nd.getNodeName(); String name = null;
if (nd.hasAttributes()) {
NamedNodeMap attrs = nd.getAttributes();
Node nameNd = attrs.getNamedItem("name");
if (nameNd != null) name=nameNd.getNodeValue();
} Object val=null; if ("str".equals(type)) {
val = getText(nd);
} else if ("int".equals(type)) {
val = Integer.valueOf(getText(nd));
} else if ("long".equals(type)) {
val = Long.valueOf(getText(nd));
} else if ("float".equals(type)) {
val = Float.valueOf(getText(nd));
} else if ("double".equals(type)) {
val = Double.valueOf(getText(nd));
} else if ("bool".equals(type)) {
val = StrUtils.parseBool(getText(nd));
} else if ("lst".equals(type)) {
val = childNodesToNamedList(nd);
} else if ("arr".equals(type)) {
val = childNodesToList(nd);
} if (nlst != null) nlst.add(name,val);
if (arr != null) arr.add(val);
}

NamedList很好的支持嵌套,例如如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<param>
<str name="client">client</str>
<str name="fields">HTTPBody</str>
<lst name="checker">
<str name="class">myclass</str>
<lst name="initArgs">
<arr name="check-fields">
<str>PageTitle</str>
<str>PageContent</str>
</arr>
<lst name="sublist">
<str name="txt">text</str>>
<lst name="child">
<str name="childtext">text</str>>
</lst>>
</lst>>
</lst>
</lst>
</param>

解析上述xml文件,代码如下:

package test;

import java.io.IOException;
import java.util.ArrayList; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory; import org.apache.solr.common.util.NamedList;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; public class NamedListTest { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String xmlpath = "/param";
getAttrs(xmlpath);
} private static void getAttrs(String expression) {
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder;
try {
builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("NewFile.xml");
XPath xpath = XPathFactory.newInstance().newXPath(); XPathExpression expr = xpath.compile(expression);
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
//System.out.println("ssss " + nodes.getLength());
for (int i = 0; i < nodes.getLength(); ++i) {
NamedList<Object> namedList = DOMUtil.childNodesToNamedList(nodes.item(i));
System.out.println(namedList.toString());
NamedList<Object> parserPosDataChecker = (NamedList<Object>) namedList.get("checker");
System.out.println("class " + parserPosDataChecker.get("class")) ; NamedList<Object> checkList = (NamedList<Object>) parserPosDataChecker.get("initArgs"); ArrayList<String> checkArr = (ArrayList<String>)checkList.get("check-fields");
System.out.println(checkArr.toString()); }
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XPathExpressionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

代码需要
DOMUtil和StrUtils的支持,这两个可以从Solr源码中直接取出就可以用,解析xml时用到了XPath,不熟悉的同学可以先看看XPath,然后再学习本实例。

Solr之NamedList 简单介绍与实例解析的更多相关文章

  1. Linux守护进程简单介绍和实例具体解释

    Linux守护进程简单介绍和实例具体解释 简单介绍 守护进程(Daemon)是执行在后台的一种特殊进程.它独立于控制终端而且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种非常实用的进程. ...

  2. Tstrings类简单介绍及实例

    用TStrings保存文件;var  S: TStrings;begin  S := TStringList.Create();  { ... }  S.SaveToFile('config.txt' ...

  3. Android开发之IPC进程间通信-AIDL介绍及实例解析

    一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用 ...

  4. Dubbo简单介绍及实例

    1.概念 Dubbo是一个分布式服务框架,以及阿里巴巴内部的SOA服务化治理方案的核心框架.其功能主要包含:高性能NIO通讯及多协议集成.服务动态寻址与路由.软负载均衡与容错,依赖分析与降级等. 说通 ...

  5. Entity Framework 的简单介绍与实例

    1.下载与引用 a) 首先需要下载一个oracle clinent 12c 发行版(我这边下载的是发行版)并进行安装,下载内容如下图 B) 创建一个项目,通过Nuget引用  添加ODP.NET    ...

  6. 简单介绍智能DNS解析+双线路接入

    导读:在讨论这个问题,其中群友老孤同志也提供了不少非常有参考价值的资料,所以我们再把这些资料再整理一次,从比较底层的技术原理上重新进行一次分析.   我们知道,因为南电信北网通现象的存在,我们的服务器 ...

  7. (八十七)AutoLayout的简单介绍与实例

    AutoLayout是继AutoResizing之后的一种自己主动布局方法.攻克了AutoResizing无法处理控件间相互关系的问题. AutoLayout在storyboard中通过底部工具条设置 ...

  8. 实例级别和类级别的static、构造函数、字段属性的简单介绍

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 实例级别 ...

  9. 以登录实例简单介绍Servlet使用

    1.简单介绍 Java Servlet 是执行在 Web server或应用server上的程序,使用 Servlet.您能够收集来自网页表单的用户输入.呈现来自数据库或者其它源的记录.还能够动态创建 ...

随机推荐

  1. 微信应用号开发知识贮备之Webpack实战

    天地会珠海分舵注:随着微信应用号的呼之欲出,相信新一轮的APP变革即将发生.作为行业内人士,我们很应该去拥抱这个趋势.这段时间在忙完工作之余准备储备一下这方面的知识点,以免将来被微信应用号的浪潮所淹没 ...

  2. EasyUI的后台界面

    EasyUI的后台界面搭建及极致重构 〇.前言 要了解一个东西长什么样,至少得让我们能看到,才能提出针对性的见解.所以,为了言之有物,而不是凭空漫谈,我们先从UI说起,后台管理页面的UI我们将使用应用 ...

  3. elasticsearch集群搭建实例

    elasticsearch集群搭建实例 下个月又开始搞搜索了,几个月没动这块还好没有落下. 晚上在自己虚拟机上搭建了一个简易搜索集群,分享一下. 操作系统环境: Red Hat 4.8.2-16 el ...

  4. 1.3 LINQ查询

    LINQ最具突破性的优势在于将文本查询与对象操作完美集成,它让查询数据和操作对象一样安全和轻松.查询(Query)是LINQ的核心概念之一. 传统意义上的数据查询语言,通常是比较易懂,具有一定语义的文 ...

  5. 使用Python改写的身份证信息查询小程序

    花了几天时间过了一遍python基础.真心感觉python让世界充满了爱…先简单的使用一下python好了,拿以前写的<C语言身份证信息查询系统(修改版)>开刀~ 很多东西,不需要考虑C语 ...

  6. swift 笔记 (二十) —— 泛型

    泛型 泛型是为了解决在针对不同数据类型.而做了同一种功能的操作导致的每一个类型我们都要写一份代码的问题. 有了泛型,我们能够仅仅写一份逻辑代码,而适应于不同的数据类型. func swapInt(in ...

  7. OpenWrt的UCI系统

    http://wiki.openwrt.org/doc/uci UCI是Unified Configuration Interface的缩写,翻译成中文就是统一配置接口,用途就是为OpenWrt提供一 ...

  8. ASP.NET开发,简化与封装

    ASP.NET开发,简化与封装 微软的ASP.NET的开发,就是面向对象的编程,当然前端也能体验至面向对象的话,使用Web控件也必须的. 任一控件,我们均可以在后端.aspx.cs或.aspx.vb程 ...

  9. 使用typeof方法反射属性和方法

    Type type = typeof(System.Int32);//获得int类型的Type对象 foreach (MethodInfo method in type.GetMethods())// ...

  10. NUnit详细使用方法

    http://www.ltesting.net/ceshi/open/kydycsgj/nunit/ http://nunit.org/index.php?p=download NUnit详细使用方法 ...