2016-07-15 5 views
0

誰でも、なぜ次のコードで結果が得られないのでしょうか?
もちろん、htmlは有効で、多くの "div"要素を持っています。最も簡単な例 - javaを使ってsaxonとhtmlをパースする方法は?

Processor proc = new Processor(false); 
    proc.setConfigurationProperty("http://saxon.sf.net/feature/sourceParserClass", "org.ccil.cowan.tagsoup.Parser"); 
    XPathCompiler xpath = proc.newXPathCompiler(); 

    DocumentBuilder builder = proc.newDocumentBuilder(); 
    XdmNode doc = builder.build(new File("/tmp/test.html")); 

    XPathSelector selector = xpath.compile("//div").load(); 
    selector.setContextItem(doc); 

    for (XdmItem item : selector) 
    { 
     System.out.println(((XdmNode)item).getNodeName()); 
    } 

私はサクソンのサンプルからそのコードを取って、コメントを追加「proc.setConfigurationPropertyを...」htmlの入力を解析するために。

私が欲しいのは、次のとおりです。
1)のXPath v3を持つ一部のクエリ

はありがとうを作る)HTML文字列
2を提出した文書ノード
3)を取得します。
P.s.私はxsltを使いたくない。

+1

HTMLパーサーをアプリケーション全体のグローバルオプションとして設定するのではなく、ビルダービルド(新しいSAXSource(新しいorg.ccil.cowan.tagsoup.Parser()、新しいInputSource /tmp/test.html ")))'。 –

答えて

0

"// * [name()=" div "]"に変更すると、問題が解決しました。

+1

それは問題を明らかにします:要素は名前空間にあります。 ( "SOFT" XPath default namespace "を検索すると、数百のヒットが見つかります。)しかし、あなたのコードは名前空間接頭辞の選択に依存するので、あなたの解決策は間違っています。任意の名前空間のdiv要素と一致させるには// *:divを使用するか、Xpath.declareNamespace( ""、XHTML_NS)を最初に実行した// divを使用して接頭辞のない名前がXHTML名前空間の要素を参照するようにする必要があります。 –

+0

@MichaelKayご意見ありがとうございました。非常に参考になりました。 名前空間についての質問: "xpath.declareNamespace(" "、XHTML_NS)"で名前空間を設定しようとしましたが、そのような定数XHTML_NSはありません。 どうすれば可能ですか?) –

+1

申し訳ありませんが、私は入力を省くためにショートカットを使用していました。定数を自分で宣言したり、リテラル値 "http://www.w3.org/1999/xhtml"を使用しなければなりません。 –

関連する問題