環境
pom.xml
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
</dependency>
やりたいこと
以下のような、デフォルト名前空間が設定されたXMLを、XPath形式でで取得したいです。
web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<context-param>
<param-name>version</param-name>
<param-value>1.2.3</param-value>
</context-param>
</web-apps>
今、 <param-name>
要素内のversion
というキーに対応する、<param-value>
要素内の1.2.3
という値を取得したいです。
試したこと
以下のコードでは、空文字が返ってきて1.2.3
という値は取得できませんでした。
Bad.java
BaseXPath xpath = new Dom4jXPath("//context-param/param-name[text()='version']/following-sibling::param-value");
String version = xpath.stringValueOf(doc); //⇒空文字
実現できた方法
デフォルト名前空間を、自分で設定する必要があります。
Good.java
//デフォルト名前空間を"p"という接頭辞にする。
BaseXPath xpath = new Dom4jXPath(//p:context-param/p:param-name[text()='version']/following-sibling::p:param-value");
xpath.addNamespace("p", "http://java.sun.com/xml/ns/j2ee");
String version = xpath.stringValueOf(doc); //⇒1.2.3
参考サイト
http://waman.hatenablog.com/entry/20091030/1256858160
http://www.edankert.com/defaultnamespaces.html#What_s_the_Problem_