0

http://www.ibm.com/developerworks/xml/library/x-nmspccontext/index.htmlをフォローしようとしています

    UniversalNamespaceResolver

XML に対する XPath 評価の名前空間を解決する例。私が遭遇した問題は、以下の lookupNamespaceURI 呼び出しが XML で null を返すことです。

    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();

    DocumentBuilder builder = domFactory.newDocumentBuilder();
    Document dDoc = builder.parse(new InputSource(new StringReader(xml)));

    String nsURI = dDoc.lookupNamespaceURI("h");

XML:

<?xml version="1.0"?>

<h:root xmlns:h="http://www.w3.org/TR/html4/">

   <h:table>
     <h:tr>
       <h:td>Apples</h:td>
       <h:td>Bananas</h:td>
     </h:tr>
   </h:table>`
</h:root>

「 http://www.w3.org/TR/html4/ 」が返されることを期待していますが。

4

1 に答える 1

3

DocumentBuilderを構成するときは、明示的に名前空間を認識させる必要があります(名前空間がなかったxmlの最初の日からのばかげた遺物):

domFactory.setNamespaceAware(true);

ちなみに、その記事のアドバイスはあまり良くありません。それは基本的に、実際のドキュメントの名前空間プレフィックスが何であるかを気にしないという点を見逃しています。それらは無関係です。使用しているxpath式と一致するxpath名前空間リゾルバーが必要です。これですべてです。彼らが提案していることを行うと、ドキュメントのプレフィックスが変更されるたびにxpathコードを変更する必要がありますが、これは恐ろしい考えです。

注意してください、彼らは最後の箇条書きでこの点を割譲しますが、記事の残りの部分では、これがxpathを使用するときの基本的な考え方であることを見逃しているようです。

ただし、XMLファイルを制御できず、誰かが希望するプレフィックスを送信できる場合は、選択内容に依存しない方がよい場合があります。例1(HardcodedNamespaceResolver)のように独自の名前空間解決をコーディングし、それらをXPath式で使用できます。

于 2013-03-22T14:02:51.517 に答える