All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jaeksoft.searchlib.util.XPathParser Maven / Gradle / Ivy

Go to download

OpenSearchServer is a powerful, enterprise-class, search engine program. Using the web user interface, the crawlers (web, file, database, ...) and the REST/RESTFul API you will be able to integrate quickly and easily advanced full-text search capabilities in your application. OpenSearchServer runs on Windows and Linux/Unix/BSD.

The newest version!
/**   
 * License Agreement for OpenSearchServer
 *
 * Copyright (C) 2008-2014 Emmanuel Keller / Jaeksoft
 * 
 * http://www.open-search-server.com
 * 
 * This file is part of OpenSearchServer.
 *
 * OpenSearchServer is free software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 * OpenSearchServer is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with OpenSearchServer. 
 *  If not, see .
 **/

package com.jaeksoft.searchlib.util;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.TreeMap;

import javax.xml.namespace.QName;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.stream.StreamSource;
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.commons.lang3.StringEscapeUtils;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class XPathParser {

	private final static XPathFactory xPathfactory = XPathFactory.newInstance();

	private final XPath xPath;
	private final Node rootNode;
	private final File currentFile;
	private final Map xPathExpressions;

	private XPathParser(File currentFile, Node rootNode) {
		this.xPath = getXPath();
		this.currentFile = currentFile;
		this.rootNode = rootNode;
		this.xPathExpressions = new TreeMap();
	}

	public static XPath getXPath() {
		synchronized (xPathfactory) {
			return xPathfactory.newXPath();
		}
	}

	public XPathParser(File file) throws ParserConfigurationException,
			SAXException, IOException {
		this(file, DomUtils.readXml(new StreamSource(file.getAbsoluteFile()),
				true));
	}

	public XPathParser(InputSource inputSource) throws SAXException,
			IOException, ParserConfigurationException {
		this(null, DomUtils.readXml(inputSource, true));
		Document document = (Document) rootNode;
		document.normalize();
	}

	public XPathParser(InputStream inputStream) throws SAXException,
			IOException, ParserConfigurationException {
		this(null, DomUtils.readXml(new InputSource(inputStream), true));
	}

	public XPathParser(Node rootNode) {
		this(null, rootNode);
	}

	public File getCurrentFile() {
		return currentFile;
	}

	private static final QName[] RETURN_TYPES = { XPathConstants.NODESET,
			XPathConstants.NODE, XPathConstants.STRING, XPathConstants.NUMBER,
			XPathConstants.BOOLEAN };

	final public static Object evaluate(final Node parentNode,
			final XPathExpression xPathExpression)
			throws XPathExpressionException {
		XPathExpressionException lastError = null;
		for (QName qname : RETURN_TYPES) {
			try {
				Object result = xPathExpression.evaluate(parentNode, qname);
				if (result != null)
					return result;
			} catch (XPathExpressionException e) {
				lastError = e;
			}
		}
		if (lastError != null)
			throw lastError;
		return null;
	}

	final public Object evaluate(final Node parentNode, final String query)
			throws XPathExpressionException {
		XPathExpression xPathExpression = xPathExpressions.get(query);
		if (xPathExpression == null) {
			xPathExpression = xPath.compile(query);
			xPathExpressions.put(query, xPathExpression);
		}
		return evaluate(parentNode, xPathExpression);
	}

	public Object evaluate(Node parentNode, String query, QName returnType)
			throws XPathExpressionException {
		return xPath.evaluate(query, parentNode, returnType);
	}

	public final Node getNode(Node parentNode, String query)
			throws XPathExpressionException {
		return (Node) xPath.evaluate(query, parentNode, XPathConstants.NODE);
	}

	public final Node getNode(String query) throws XPathExpressionException {
		return getNode(rootNode, query);
	}

	public final String getNodeString(Node parentNode, String query)
			throws XPathExpressionException {
		return (String) xPath
				.evaluate(query, parentNode, XPathConstants.STRING);
	}

	public final String getNodeString(String query)
			throws XPathExpressionException {
		return getNodeString(rootNode, query);
	}

	public final String getNodeString(Node node, boolean trim)
			throws XPathExpressionException {
		String txt = xPath.evaluate("text()", node);
		if (txt == null)
			return null;
		return trim ? txt.trim() : txt;
	}

	public final NodeList getNodeList(Node parentNode, String query)
			throws XPathExpressionException {
		return (NodeList) xPath.evaluate(query, parentNode,
				XPathConstants.NODESET);
	}

	public final NodeList getNodeList(String query)
			throws XPathExpressionException {
		return getNodeList(rootNode, query);
	}

	public final String getAttributeString(String query, String attributeName)
			throws XPathExpressionException {
		Node node = getNode(query);
		if (node == null)
			return null;
		return getAttributeString(node, attributeName);
	}

	public final int getAttributeValue(String query, String attributeName)
			throws XPathExpressionException {
		Node node = getNode(query);
		if (node == null)
			return 0;
		return getAttributeValue(node, attributeName);
	}

	private final static String getAttributeString(Node node,
			String attributeName, boolean unescapeXml) {
		NamedNodeMap attr = node.getAttributes();
		if (attr == null)
			return null;
		Node n = attr.getNamedItem(attributeName);
		if (n == null)
			return null;
		String t = n.getTextContent();
		if (t == null)
			return null;
		return unescapeXml ? StringEscapeUtils.unescapeXml(t) : t;
	}

	public final static boolean getAttributeStringMatch(Node node,
			String attributeName, String value) {
		if (value == null)
			return false;
		return value.equals(getAttributeString(node, attributeName, true));
	}

	public final static String getAttributeString(Node node,
			String attributeName) {
		return getAttributeString(node, attributeName, true);
	}

	public final static int getAttributeValue(Node node, String attributeName) {
		String value = getAttributeString(node, attributeName, false);
		if (value == null || value.length() == 0)
			return 0;
		return Integer.parseInt(value);
	}

	public final static long getAttributeLong(Node node, String attributeName) {
		String value = getAttributeString(node, attributeName, false);
		if (value == null || value.length() == 0)
			return 0;
		return Long.parseLong(value);
	}

	public final static Float getAttributeFloat(Node node, String attributeName) {
		String value = getAttributeString(node, attributeName, false);
		if (value == null || value.length() == 0)
			return null;
		return Float.parseFloat(value);
	}

	public final static double getAttributeDouble(Node node,
			String attributeName) {
		String value = getAttributeString(node, attributeName, false);
		if (value == null || value.length() == 0)
			return 0;
		return Double.parseDouble(value);
	}

	final public String getSubNodeTextIfAny(Node parentNode, String nodeName,
			boolean trim) throws XPathExpressionException {
		Node node = getNode(parentNode, nodeName);
		if (node == null)
			return null;
		String txt = node.getTextContent();
		if (txt == null)
			return null;
		return trim ? txt.trim() : txt;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy