xpatch式が渡されると、「doc」で参照されているxmlドキュメント内の指定された要素の値を抽出するメソッド(getSingleNodeValue())があります。この時点でdocが以下に示すように初期化されており、xmlInputがxmlコンテンツを含むバッファーであると想定します。
SAXBuilder builder = null;
Document doc = null;
XPath xpathInstance = null;
doc = builder.build(new StringReader(xmlInput));
メソッドを呼び出すと、次のxpathxpressionを渡します
/TOP4A/PERLODSUMDEC/TINPLD1/text()
これが方法です。基本的にはxmlバッファーを受け取り、xpathを使用して値を抽出します。
public static String getSingleNodeValue(String xpathExpr) throws Exception{
Text list = null;
try {
xpathInstance = XPath.newInstance(xpathExpr);
list = (Text) xpathInstance.selectSingleNode(doc);
} catch (JDOMException e) {
throw new Exception(e);
}catch (Exception e){
throw new Exception(e);
}
return list==null ? "?" : list.getText();
}
上記のメソッドは常に「?」を返します つまり、何も見つからないため、「list」はnullです。それが見るxmlドキュメントは
<TOP4A xmlns="http://www.testurl.co.uk/enment/gqr/3232/1">
<HEAD>
<Doc>ABCDUK1234</Doc>
</HEAD>
<PERLODSUMDEC>
<TINPLD1>10109000000000000</TINPLD1>
</PERLODSUMDEC>
</TOP4A>
同じ方法が他のxmlドキュメントでも機能するので、これについて何が特別なのかわかりません。例外はないので、xmlは有効なxmlです。メソッドが常に「list」をnullに設定するというだけです。何か案は?
編集
提案されているように、これは上記を示す簡単な実行プログラムです
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.xpath.*;
import java.io.IOException;
import java.io.StringReader;
public class XpathTest {
public static String getSingleNodeValue(String xpathExpr, String xmlInput) throws Exception{
Text list = null;
SAXBuilder builder = null;
Document doc = null;
XPath xpathInstance = null;
try {
builder = new SAXBuilder();
doc = builder.build(new StringReader(xmlInput));
xpathInstance = XPath.newInstance(xpathExpr);
list = (Text) xpathInstance.selectSingleNode(doc);
} catch (JDOMException e) {
throw new Exception(e);
}catch (Exception e){
throw new Exception(e);
}
return list==null ? "Nothing Found" : list.getText();
}
public static void main(String[] args){
String xmlInput1 = "<TOP4A xmlns=\"http://www.testurl.co.uk/enment/gqr/3232/1\"><HEAD><Doc>ABCDUK1234</Doc></HEAD><PERLODSUMDEC><TINPLD1>10109000000000000</TINPLD1></PERLODSUMDEC></TOP4A>";
String xpathExpr = "/TOP4A/PERLODSUMDEC/TINPLD1/text()";
XpathTest xp = new XpathTest();
try {
System.out.println(xp.getSingleNodeValue(xpathExpr, xmlInput1));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上記を実行すると、出力は次のようになります。
Nothing found
編集
さらにテストを実行しましたが、名前空間のURLを削除しても機能するようです。理由はまだわかりません。名前空間を無視するように指示する方法はありますか?
編集
上記はJDK1.4.1に実装されているため、それ以降のバージョンのJDKのオプションがないことにも注意してください。これが私がJdomに固執しなければならなかった理由です。