0
私は、Webページからseleniumとxpath2.0関数を使ってデータをスクレイプする簡単なコードを書いています。Saxonを使ってJavaでXpath 2.0の関数が動作しない
セレンのみxpath1.0機能をサポートしているので、私はSaxon.jar
- を使用しようとしています私は、「CパスにダウンロードしてSaxon9he.jarのファイルを抽出した:\プログラムファイル\のJava \ jre1 .8.0_111 \ libに\ extに次の行を含むjaxp.properties "」
- は、私は、ファイルを作成している": はjavax.xml.transform.TransformerFactory = net.sf.saxon.TransformerFactoryImpl 持つjavax.xml.xpath。 XPathFactory "、" net.sf.saxon.xpath.XPathFactoryImpl
- Eclipseライブラリーのjarファイルも含まれています。
しかし、私はXpath2.0関数で値を取得できません。私のコードで
、私は
XPathFactory factory = XPathFactory.newInstance();
代わりの
XPathFactory factory = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON);
を使用する場合、私はxpath1.0機能を使用することができています。しかし、私はXpath2.0機能が必要です。これで私を案内してください。
私のコードではありません:サクソンの
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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 javax.xml.xpath.XPathFactoryConfigurationException;
import javax.xml.xpath.XPathFunctionResolver;
import javax.xml.xpath.XPathVariableResolver;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import net.sf.saxon.lib.NamespaceConstant;
import net.sf.saxon.xpath.XPathFactoryImpl;
public class XpathCheckClass {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathFactoryConfigurationException, XPathExpressionException{
WebDriver dr = new FirefoxDriver();
dr.get("http://s15.a2zinc.net/clients/hartenergy/midstream17/Public/eBooth.aspx?Nav=False&BoothID=137384");
try {
Thread.sleep(3000);
} catch (Exception e) {
}
String source = dr.getPageSource();
Document doc = null;
try {
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
doc = db.parse(new InputSource(new StringReader(source)));
} catch (Exception e) {
e.printStackTrace();
}
System.setProperty("javax.xml.xpath.XPathFactory:"+NamespaceConstant.OBJECT_MODEL_SAXON, "net.sf.saxon.xpath.XPathFactoryImpl");
XPathFactory factory = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON);
// XPathFactory factory = XPathFactory.newInstance(); ---> default xpath factory
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("if(//h2) then //h2 else //h1");
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
System.out.println(nodes.getLength());
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getTextContent());
}
dr.close();
}
}
ほんの少しの説明を追加しますサクソンJARがXPathプロセッサとして公開されていない理由は、XPath 1.0で動作するように書かれテストされたアプリケーションが多すぎるということです。残念ながら、JAXPインターフェイスは「私にXPath 2.0プロセッサを見つけてください」と言っても意味がありません。 –