0

更新しました:

xsi:noNamespaceSchemaLocation の属性の値を取得したいと思います。つまり、「http://www.mypage/pagedescription.xsd

<link 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:noNamespaceSchemaLocation="http://www.mypage/pagedescription.xsd">


 ...
 ...

link は XML ファイルの要素です (ほぼ上部にあります)

ただし、XPATH //n:link/@xsi:noNamespaceSchemaLocation は機能しません

コンテキストを変更しようとしましたが、まだ機能しません

@Override
public Object executeXpathQuery(Document domDoc, String strQuery) throws Exception {


    System.out.println("executeXpathQuery : strQuery:" + strQuery);

    // output: executeXpathQuery:  strQuery://n:link/@xsi:noNamespaceSchemaLocation
    // so far, it looks OK

    XPathFactory xpf = XPathFactory.newInstance();
    XPath xPath = xpf.newXPath();

    final String nonameNamespace = domDoc.getFirstChild().getNamespaceURI();

    NamespaceContext ctx = new NamespaceContext() {
        public String getNamespaceURI(String prefix) {

            String uri = null;
            if ("n".equals(prefix)) {
                System.out.println("using prefix");
                uri = nonameNamespace;
            } 
            else if ("xsi".equals(prefix)) {
                 uri = "http://www.w3.org/2001/XMLSchema-instance";
            }
            return null;
        }
        public String getPrefix(String uri) {
            throw new UnsupportedOperationException();
        }
        public Iterator getPrefixes(String uri) {
            throw new UnsupportedOperationException();
         }
    };


    xPath.setNamespaceContext(ctx);

    XPathExpression xPathExp = xPath.compile(strQuery);


    return (Node) xPathExp.evaluate(domDoc,XPathConstants.NODE);

}

そして、ドキュメント ビルダーにコンテキストを認識させました。

    static DocumentBuilder getDocumentBuilder() {
    DocumentBuilderFactory dbf;
    DocumentBuilder db;

    db = null;

    try {
        dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        db = dbf.newDocumentBuilder();
    } catch (ParserConfigurationException e) {
        LogMes.log(XMLFactoryServiceImpl.class, LogMes.ERROR, "Erreur lors de la cràation d'un document DOM. Message: " + e.getMessage());
    }
    return db;
}

出力に「接頭辞を使用」が表示されます => この部分は問題ありませんが、まだ null 値が表示されます

何か案は ?

4

1 に答える 1

2

あなたは 99% の道のりを進んでいます。あとは、戻り値をプレフィックスNamespaceContextに対して正しいものにする必要があるだけです。xsi

    public String getNamespaceURI(String prefix) {

        String uri = null;
        if ("n".equals(prefix)) {
            System.out.println("using prefix");
            uri = nonameNamespace;
        } else if ("xsi".equals(prefix)) {
            uri = "http://www.w3.org/2001/XMLSchema-instance";
        }
        return uri;
    }

また、domDocを使用して XML を解析して を作成する場合は、 beforeDocumentBuilderを呼び出してビルダーが名前空間を認識していることを確認する必要があります。私が推測できるのは歴史的な理由だけで、DBF のデフォルトは名前空間を処理せずに解析することであり、そのような DOM ツリーは XPath では機能しません。docBuilderFactory.setNamespaceAware(true).newDocumentBuilder()

于 2014-01-23T15:14:39.703 に答える