1

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に固執しなければならなかった理由です。

4

1 に答える 1

2

問題はXML名前空間にあります。XPathクエリは、デフォルトの名前空間で「TOP4A」要素を選択することから始まります。ただし、XMLファイルの代わりに「http://www.testurl.co.uk/enment/gqr/3232/1」名前空間に「TOP4A」要素があります。

XMLからxmlnsを削除するオプションはありますか?

于 2011-09-03T16:00:28.117 に答える