Description
Evaluates the specified XPath expression and returns the result as a Date.
License
Open Source License
Parameter
Parameter | Description |
---|
expression | The XPath expression to evaluate. |
node | The node to run the expression on. |
Exception
Parameter | Description |
---|
XPathExpressionException | If there was a problem processing the specified XPathexpression. |
Return
The Date result.
Declaration
public static Date asDate(String expression, Node node)
throws XPathExpressionException
Method Source Code
/*/*from w ww . j a v a2 s . co m*/
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.nio.ByteBuffer;
import java.text.ParseException;
import java.util.Date;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import com.amazonaws.AmazonClientException;
public class Main{
/** Shared DateUtils object for parsing and formatting dates */
private static DateUtils dateUtils = new DateUtils();
/** Shared logger */
private static Log log = LogFactory.getLog(XpathUtils.class);
/**
* Evaluates the specified XPath expression and returns the result as a
* Date. Assumes that the node's text is formatted as an ISO 8601 date, as
* specified by xs:dateTime.
*
* @param expression
* The XPath expression to evaluate.
* @param node
* The node to run the expression on.
*
* @return The Date result.
*
* @throws XPathExpressionException
* If there was a problem processing the specified XPath
* expression.
*/
public static Date asDate(String expression, Node node)
throws XPathExpressionException {
String dateString = evaluateAsString(expression, node);
if (isEmptyString(dateString))
return null;
try {
return dateUtils.parseIso8601Date(dateString);
} catch (ParseException e) {
log.error(
"Unable to parse date '" + dateString + "': "
+ e.getMessage(), e);
return null;
}
}
/**
* Evaluates the specified expression on the specified node and returns the
* result as a String.
*
* @param expression
* The Xpath expression to evaluate.
* @param node
* The node on which to evaluate the expression.
*
* @return The result of evaluating the specified expression, or null if the
* evaluation didn't return any result.
*
* @throws XPathExpressionException
* If there are any problems evaluating the Xpath expression.
*/
private static String evaluateAsString(String expression, Node node)
throws XPathExpressionException {
if (isEmpty(node))
return null;
String s = evaluateXPath(node, expression);
if (s == null) {
return null;
} else {
return s.trim();
}
}
/**
* Returns true if the specified string is null or empty.
*
* @param s
* The string to test.
* @return True if the specified string is null or empty.
*/
private static boolean isEmptyString(String s) {
if (s == null)
return true;
if (s.trim().equals(""))
return true;
return false;
}
/**
* Returns true if the specified node is null or has no children.
*
* @param node
* The node to test.
*
* @return True if the specified node is null or has no children.
*/
public static boolean isEmpty(Node node) {
return (node == null);
}
private static String evaluateXPath(Node node, String xPath) {
int currentSearchIndex = 0;
while (currentSearchIndex < xPath.length()) {
int endingIndex = xPath.indexOf("/", currentSearchIndex);
String noderNameFromXPath = null;
if (endingIndex == -1) {
noderNameFromXPath = xPath.substring(currentSearchIndex);
} else {
noderNameFromXPath = xPath.substring(currentSearchIndex,
endingIndex);
}
node = findChildNodeWithName(node, noderNameFromXPath);
if (endingIndex == -1) {
break;
}
currentSearchIndex = endingIndex + 1;
}
if (node != null && node.getFirstChild() != null) {
return node.getFirstChild().getNodeValue();
} else if (node != null) {
return node.getNodeValue();
} else {
return null;
}
}
private static Node findChildNodeWithName(Node node, String childName) {
if (node == null) {
return null;
} else {
if (node.getNodeName().equals(childName)) {
return node;
} else {
NodeList nodeList = node.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
if (nodeList.item(i).getNodeName().equals(childName)) {
return nodeList.item(i);
}
}
return null;
}
}
}
}
Related
- asNodeList(String nodeName, Node node)
- asLong(String expression, Node node)
- asInteger(String expression, Node node)
- asFloat(String expression, Node node)
- asDouble(String expression, Node node)
- asByte(String expression, Node node)
- asByteBuffer(String expression, Node node)
- asBoolean(String expression, Node node)
- evaluateXPath(Node node, String xPath)