2016-12-26 8 views
0

私は、Webページからseleniumとxpath2.0関数を使ってデータをスクレイプする簡単なコードを書いています。Saxonを使ってJavaでXpath 2.0の関数が動作しない

セレンのみxpath1.0機能をサポートしているので、私はSaxon.jar

  1. を使用しようとしています私は、「CパスにダウンロードしてSaxon9he.jarのファイルを抽出した:\プログラムファイル\のJava \ jre1 .8.0_111 \ libに\ extに次の行を含むjaxp.properties "」
  2. は、私は、ファイルを作成している": はjavax.xml.transform.TransformerFactory = net.sf.saxon.TransformerFactoryImpl 持つjavax.xml.xpath。 XPathFactory "、" net.sf.saxon.xpath.XPathFactoryImpl
  3. 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(); 
} 

} 

答えて

1

最近のリリースでは、もはやあなたが明示的にXPathの工場をインスタンス化する必要があるので、JAXPのXPathのサービスとして自分自身を宣伝:

XPathFactory xf = new net.sf.saxon.XPathFactoryImpl(); 
+0

ほんの少しの説明を追加しますサクソンJARがXPathプロセッサとして公開されていない理由は、XPath 1.0で動作するように書かれテストされたアプリケーションが多すぎるということです。残念ながら、JAXPインターフェイスは「私にXPath 2.0プロセッサを見つけてください」と言っても意味がありません。 –

関連する問題