2010-12-07 16 views
3

これはいつか動作していたと思いますが、xpathはnullを返します。誰かが私の愚かなミスをコードに従うのを助けることができますか?
または、setNamespaceAware(false)の後でもNamespaceContextを提供する必要がありますか?xpathのdefaultNamespaceでXPathがnullを返す

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
domFactory.setNamespaceAware(false); 
domFactory.setIgnoringComments(true); 
domFactory.setIgnoringElementContentWhitespace(true); 

try { 
Document doc = domFactory.newDocumentBuilder().parse(new File("E:/Temp/test.xml")); 
XPath xp = XPathFactory.newInstance().newXPath(); 
NodeList nl = (NodeList) xp.evaluate("//class", doc, XPathConstants.NODESET); 
System.out.println(nl.getLength()); 
}catch (Exception e){ 
e.printStackTrace(); 
} 

XMLドキュメントはこちらです:

<?xml version="1.0" encoding="UTF-8"?> 
<root xmlns="http://www.example.com/schema"> 
<class /> 
<class /> 
</root> 
+0

これを(Java 1.6で)実行すると、「2」が出力されます。 –

+1

ここの変数は、 'domFactory.newDocumentBuilder()。parse(file)'によって選択されたデフォルトのパーサー実装です。 –

+0

ああ、神様、私は怒っています。私はJava 1.6ではテストしていますが、0を取得しています。 – WSK

答えて

5

3つのオプションが明らかです。 "//class"から"//*[local-name() = 'class']"にあなたのXPathの

  • 変更:私の視点から、最も簡単な最初のために。それは少しkludgyですが、それは名前空間を無視します。これでもあなたにゼロが与えられれば、問題は名前空間ではないことが分かります。
  • Javaコードで「http://www.example.com/schema」の名前空間接頭辞を登録し、あなたのXPath式でそれを使用する:あなたが使用して、なぜそれがだているものパーサの実装"//foo:class"
  • フィギュアアウト@ Rodney'sとは違った動作をするか、別のものに変更する