【问题标题】:Apaches DTM to Plaintext for css-queryingApaches DTM 到纯文本用于 css 查询
【发布时间】:2016-11-01 02:22:27
【问题描述】:

我正在编写一个 XPath 函数表达式来通过 CSS 查询查找元素。

这就是我所拥有的:

import javax.xml.transform.TransformerException;    
import org.apache.xml.dtm.ref.dom2dtm.DOM2DTM;
import org.apache.xpath.XPathContext;
import org.apache.xpath.functions.FunctionOneArg;
import org.apache.xpath.objects.XObject;
import org.apache.xpath.objects.XString;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class CSSFinder extends FunctionOneArg {
    @Override
    public XObject execute(XPathContext c) throws TransformerException {
        final DOM2DTM dtm = (DOM2DTM) c.getDTM(c.getContextNode());
        final Document parse = Jsoup.parse(dtm.toString()); // toString returns not html.
        final Elements parents = parse.select(getArg0().toString()).first().parents();
        String xpath = "/";
        for (final Element parent : parents) {
            xpath += "/*[" + parent.elementSiblingIndex() + "]";
        }
        // replace this later...
        return new XString("sc-login");
    }
}

问题是toString 不返回html。如何获取完整解析的html?

【问题讨论】:

    标签: css xpath xalan canoo-webtest


    【解决方案1】:

    找到解决方案:

    import java.io.IOException;
    import java.util.Collections;
    
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.apache.commons.io.output.ByteArrayOutputStream;
    import org.apache.xml.dtm.ref.dom2dtm.DOM2DTM;
    import org.apache.xpath.XPathContext;
    import org.apache.xpath.functions.FunctionOneArg;
    import org.apache.xpath.objects.XNodeSetForDOM;
    import org.apache.xpath.objects.XObject;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    import org.w3c.dom.Node;
    
    import com.gargoylesoftware.htmlunit.html.xpath.XPathUtils;
    
    public class CSSFinder extends FunctionOneArg {
        @Override
        public XObject execute(XPathContext c) throws TransformerException {
            final DOM2DTM currentNode = (DOM2DTM) c.getDTM(c.getContextNode());
            final Node root = currentNode.getNode(currentNode.getDocumentRoot(c.getContextNode()));
            final Transformer transformer = TransformerFactory.newInstance().newTransformer();
            final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            transformer.transform(new DOMSource(root), new StreamResult(outputStream));
            try {
                outputStream.close();
            } catch (final IOException e) {
                e.printStackTrace();
            }
            final Document parse = Jsoup.parse(outputStream.toString());
            final Element current = parse.select(getArg0().toString()).first();
            final Elements parents = current.parents();
            Collections.reverse(parents);
            String xpath = "";
            for (final Element parent : parents) {
                final int index = parent.elementSiblingIndex() + 1;
                xpath += "/*[" + index + "]";
            }
            xpath += "/*[" + (current.elementSiblingIndex()+1) + "]";
            return new XNodeSetForDOM((Node) XPathUtils.getByXPath(root, xpath).get(0), c.getDTMManager());
        }
    }
    

    我必须注册函数

    XPathHelper.registerGlobalFunction("http://webtest.canoo.com", "css", CSSFinder.class);
    

    然后我们进入 canoo webtest:

    <clickElement xpath="wt:css('button.sc-login')" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-23
      • 2015-10-30
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 2015-11-12
      • 2015-06-05
      • 2016-05-16
      相关资源
      最近更新 更多