Search in sources :

Example 1 with XValue

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;
}
Also used : CommonTokenStream(org.antlr.v4.runtime.CommonTokenStream) XpathLexer(org.seimicrawler.xpath.antlr.XpathLexer) Element(org.jsoup.nodes.Element) XValue(org.seimicrawler.xpath.core.XValue) LinkedList(java.util.LinkedList) CharStream(org.antlr.v4.runtime.CharStream) DoFailOnErrorHandler(org.seimicrawler.xpath.exception.DoFailOnErrorHandler) XpathParserException(org.seimicrawler.xpath.exception.XpathParserException) XpathSyntaxErrorException(org.seimicrawler.xpath.exception.XpathSyntaxErrorException) XpathParser(org.seimicrawler.xpath.antlr.XpathParser) XpathSyntaxErrorException(org.seimicrawler.xpath.exception.XpathSyntaxErrorException) XpathProcessor(org.seimicrawler.xpath.core.XpathProcessor) ParseTree(org.antlr.v4.runtime.tree.ParseTree)

Example 2 with XValue

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());
}
Also used : XValue(org.seimicrawler.xpath.core.XValue) LinkedList(java.util.LinkedList) Test(org.junit.Test)

Example 3 with XValue

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);
}
Also used : CommonTokenStream(org.antlr.v4.runtime.CommonTokenStream) XpathParser(org.seimicrawler.xpath.antlr.XpathParser) XpathLexer(org.seimicrawler.xpath.antlr.XpathLexer) XpathProcessor(org.seimicrawler.xpath.core.XpathProcessor) XValue(org.seimicrawler.xpath.core.XValue) CharStream(org.antlr.v4.runtime.CharStream) DoFailOnErrorHandler(org.seimicrawler.xpath.exception.DoFailOnErrorHandler) ParseTree(org.antlr.v4.runtime.tree.ParseTree) Test(org.junit.Test) BaseTest(org.seimicrawler.xpath.BaseTest)

Example 4 with XValue

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);
    }
}
Also used : Element(org.jsoup.nodes.Element) XValue(org.seimicrawler.xpath.core.XValue) LinkedList(java.util.LinkedList) BigDecimal(java.math.BigDecimal)

Example 5 with XValue

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);
    }
}
Also used : Matcher(java.util.regex.Matcher) XValue(org.seimicrawler.xpath.core.XValue) NodeTest(org.seimicrawler.xpath.core.NodeTest) BigDecimal(java.math.BigDecimal)

Aggregations

XValue (org.seimicrawler.xpath.core.XValue)10 Test (org.junit.Test)7 LinkedList (java.util.LinkedList)5 Element (org.jsoup.nodes.Element)5 BaseTest (org.seimicrawler.xpath.BaseTest)4 Elements (org.jsoup.select.Elements)3 BigDecimal (java.math.BigDecimal)2 CharStream (org.antlr.v4.runtime.CharStream)2 CommonTokenStream (org.antlr.v4.runtime.CommonTokenStream)2 ParseTree (org.antlr.v4.runtime.tree.ParseTree)2 XpathLexer (org.seimicrawler.xpath.antlr.XpathLexer)2 XpathParser (org.seimicrawler.xpath.antlr.XpathParser)2 XpathProcessor (org.seimicrawler.xpath.core.XpathProcessor)2 DoFailOnErrorHandler (org.seimicrawler.xpath.exception.DoFailOnErrorHandler)2 Matcher (java.util.regex.Matcher)1 NodeTest (org.seimicrawler.xpath.core.NodeTest)1 XpathParserException (org.seimicrawler.xpath.exception.XpathParserException)1 XpathSyntaxErrorException (org.seimicrawler.xpath.exception.XpathSyntaxErrorException)1