use of org.seimicrawler.xpath.core.XValue in project JsoupXpath by zhegexiaohuozi.
the class JXDocument method selN.
public List<JXNode> selN(String xpath) {
List<JXNode> finalRes = new LinkedList<>();
try {
CharStream input = CharStreams.fromString(xpath);
XpathLexer lexer = new XpathLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
XpathParser parser = new XpathParser(tokens);
parser.setErrorHandler(new DoFailOnErrorHandler());
ParseTree tree = parser.main();
XpathProcessor processor = new XpathProcessor(elements);
XValue calRes = processor.visit(tree);
if (calRes == null) {
finalRes.add(JXNode.create(""));
return finalRes;
}
if (calRes.isElements()) {
for (Element el : calRes.asElements()) {
finalRes.add(JXNode.create(el));
}
return finalRes;
}
if (calRes.isList()) {
for (String str : calRes.asList()) {
finalRes.add(JXNode.create(str));
}
return finalRes;
}
if (calRes.isString()) {
finalRes.add(JXNode.create(calRes.asString()));
return finalRes;
}
if (calRes.isNumber()) {
Class vType = calRes.valType();
if (vType.isAssignableFrom(Long.class) || vType.isAssignableFrom(Integer.class)) {
finalRes.add(JXNode.create(calRes.asLong()));
} else {
finalRes.add(JXNode.create(calRes.asDouble()));
}
return finalRes;
}
if (calRes.isBoolean()) {
finalRes.add(JXNode.create(calRes.asBoolean()));
return finalRes;
}
if (calRes.isDate()) {
finalRes.add(JXNode.create(calRes.asDate()));
return finalRes;
}
finalRes.add(JXNode.create(calRes.asString()));
} catch (Exception e) {
String msg = "Please check the syntax of your xpath expr or commit a Issue. ";
throw new XpathSyntaxErrorException(msg + ExceptionUtils.getRootCauseMessage(e), e);
}
return finalRes;
}
use of org.seimicrawler.xpath.core.XValue in project JsoupXpath by zhegexiaohuozi.
the class DateFormatTest method defaultTimeTest.
@Test
public void defaultTimeTest() {
List<XValue> params = new LinkedList<>();
params.add(XValue.create("19:05:42"));
params.add(XValue.create("HH:mm:ss"));
FormatDate formatDate = new FormatDate();
XValue value = formatDate.call(null, params);
System.out.println(value.asDate());
}
use of org.seimicrawler.xpath.core.XValue in project JsoupXpath by zhegexiaohuozi.
the class ExprTest method exp.
@Test
public void exp() {
String xpath = "//a[@id]/@href";
CharStream input = CharStreams.fromString(xpath);
XpathLexer lexer = new XpathLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
XpathParser parser = new XpathParser(tokens);
parser.setErrorHandler(new DoFailOnErrorHandler());
ParseTree tree = parser.main();
XpathProcessor processor = new XpathProcessor(root);
XValue value = processor.visit(tree);
logger.info("visit res = {}", value);
}
use of org.seimicrawler.xpath.core.XValue in project JsoupXpath by zhegexiaohuozi.
the class Sum method call.
@Override
public XValue call(Scope scope, List<XValue> params) {
if (params == null || params.isEmpty()) {
return XValue.create(0);
}
List<Double> pvs = new LinkedList<>();
for (XValue p : params) {
if (p.isNumber()) {
pvs.add(p.asDouble());
}
if (p.isString()) {
Double pv = getNumFromStr(p.asString());
if (pv == null) {
return null;
}
pvs.add(pv);
}
if (p.isElements()) {
for (Element e : p.asElements()) {
Double pv = getNumFromStr(e.ownText());
if (pv == null) {
return null;
}
pvs.add(pv);
}
}
}
Double finalVal = pvs.stream().reduce(0.0, Double::sum);
if (finalVal.compareTo(new BigDecimal(finalVal.longValue()).doubleValue()) == 0) {
return XValue.create(new Long(finalVal.longValue()));
} else {
return XValue.create(finalVal);
}
}
use of org.seimicrawler.xpath.core.XValue in project JsoupXpath by zhegexiaohuozi.
the class Num method call.
/**
* 函数具体逻辑
*
* @param scope 上下文
* @return 计算好的节点
*/
@Override
public XValue call(Scope scope) {
NodeTest textFun = Scanner.findNodeTestByName("allText");
XValue textVal = textFun.call(scope);
String whole = StringUtils.join(textVal.asList(), "");
Matcher matcher = Constants.NUM_PATTERN.matcher(whole);
if (matcher.find()) {
String numStr = matcher.group();
BigDecimal num = new BigDecimal(numStr);
if (num.compareTo(new BigDecimal(num.longValue())) == 0) {
return XValue.create(num.longValue());
}
return XValue.create(num.doubleValue());
} else {
return XValue.create(null);
}
}
Aggregations