大家都知道,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. XShell删除键之类的不正常

    异常处理汇总-开发工具  http://www.cnblogs.com/dunitian/p/4522988.html 一图解决 异常处理汇总:http://www.cnblogs.com/dunit ...

  2. Codeforces Round #267 (Div. 2)D(DFS+单词hash+简单DP)

    D. Fedor and Essay time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. 使用JavaCompiler编译java源文件

    从1.6版本的JDK开始,JDK提供了标准的包可以方便的调用JVM的编译器,可以方便的使用JVM的编译器来编译java源文件.JDK提供的调用接口是JavaCompiler类,该类在JDK的tools ...

  4. SQL点滴13—收集SQLServer线程等待信息

    原文:SQL点滴13-收集SQLServer线程等待信息 要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信 ...

  5. 在OpenWrt上编写自己的硬件操作程序

    上一篇文章中有写到如何使用OPENWRT的SDK,这里继续,写怎么在上面开发自己的应用程序. 我欲在OpenWrt上编写一个软件,它能够去读取某个AD芯片的多通道采样值. 在看这篇文章之前请看这官方的 ...

  6. SaaS模式和实现思路

    EFW框架开发的系统支持SaaS模式和实现思路 回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dAD ...

  7. [翻译]初识SQL Server 2005 Reporting Services Part 2

    原文:[翻译]初识SQL Server 2005 Reporting Services Part 2 在Part 1文章中我们对SQL Server Reporting Services 2005(S ...

  8. Mysql高级之权限检查原理

    原文:Mysql高级之权限检查原理 用户进行数据库操作分为两步: 1 是否有权限连接,根据host,name,password: 2 是否有权限进行CURD: 图示解说: 关于用户权限在哪里进行存放? ...

  9. GoogleGoogle搜索解析

    GoogleGoogle搜索解析 是一个类似Google趋势SEO 在 线keyword工具.它的正式口号提出“在搜索些什么”.利用Google搜索解析,能够比較特定区域.类别.时间范围以及搜索资源之 ...

  10. [转]C# and the using Statement in 3 seconds and a bug in Reflector

    Using() Statement in 3 seconds and a bug in Reflector The boring, known accross the board definition ...