LoginSignup
1
0

More than 5 years have passed since last update.

`SAXReader`:デフォルト名前空間が設定されたxmlファイルを、XPath形式で取得する

Last updated at Posted at 2018-03-25

環境

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_

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0