2017-03-02 10 views
4

私はこのようないくつかのXML文字列をロードしています:なぜgetLocalName()はnullを返しますか?

Document doc = getDocumentBuilder().parse(new InputSource(new StringReader(xml))); 

その後、私はこのDocumentからノードを抽出します。

XPath xpath = getXPathFactory().newXPath(); 
XPathExpression expr = xpath.compile(expressionXPATH); 
NodeList nodeList = (NodeList)expr.evaluate(doc, XPathConstants.NODESET); 

Node node = nodeList.item(0); 

今私は、このノードのローカル名を取得したいが、私は得ますnullDOCUMENT_POSITION_DISCONNECTED:デバッガで

node.getLocalName(); // return null 

は、私は私のノードは、次の型を持っていることがわかりました。

The JavadocgetLocalName()は、このタイプのノードではnullを返します。

  • なぜノードのタイプがDOCUMENT_POSITION_DISCONNECTEDであり、ELEMENT_NODEではないのですか?
  • ノードのタイプを「変換する」方法は?
  • ドキュメントとして
+1

問題を再現できる最小限の完全なサンプルを表示するにはどうすればよいですか? 'xml'と' expressionXPATH'を表示します。 –

+0

名前空間を認識する 'DocumentBuilderFactory'を使用しましたか? –

+0

少なくとも、使用しているXPath式を表示してください。 – VGR

答えて

3

https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html#getLocalName()状態:DOMレベル1メソッドで作成されたノードのための

、[...]これは常に

nullであるので、必ず名前空間を使用しますDocumentBuilderFactorysetNamespaceAware(true)とすると、DOMは名前空間を認識するDOM Level 2/3をサポートしており、getLocalName()にはnull以外の値を持ちます。

簡単なテストプログラム

String xml = "<root/>"; 

    DocumentBuilderFactory db = DocumentBuilderFactory.newInstance(); 

    Document dom1 = db.newDocumentBuilder().parse(new InputSource(new StringReader(xml))); 

    System.out.println(dom1.getDocumentElement().getLocalName() == null); 

    db.setNamespaceAware(true); 

    Document dom2 = db.newDocumentBuilder().parse(new InputSource(new StringReader(xml))); 

    System.out.println(dom2.getDocumentElement().getLocalName() == null); 

出力

true 
false 

ので、(少なくとも)あなたが持っている地元の名の問題はDOMレベル1を使用することによって引き起こされ、意識文書(ビルダーファクトリを名前空間ではありません)。

+0

どのDOMレベルが使用されているかを知るには? – Stephan

+0

既存の実装を問い合せる場合は、https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/DOMImplementation.html#hasFeature(java.lang.String)を参照する必要があります。 、%20java.lang.String)を使用してサポートされているさまざまな機能をテストします。しかし、どれほど正確かはわかりませんが、意味のあるXPathを使用するには、ネームスペースを認識するDOMが不可欠であることがわかります。 –

関連する問題