2012-10-31 8 views
6

私はTAG2から値を取得したいと私は、このXMLました:getElementsByTagNameNSがJavaで空であるのはなぜですか?

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + 
      "<ns1:schema xmlns:ns1='http://example.com'>" + 
       "<ns1:tag1>" + 
       " <ns1:tag2>value</ns1:tag2>" + 
       "</ns1:tag1>" + 
      "</ns1:schema>"; 

その後、文書にそれを解析し、tagnameNSによって要素を取得したいが。しかし、私がこれを実行するとき、ノードリストはなぜ空であるのですか?

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
     docBuilderFactory.setNamespaceAware(true); 
     DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
     Document doc = docBuilder.parse(new InputSource(new StringReader(xml))); 

     NodeList nl = doc.getElementsByTagNameNS("http://example.com", "tag2"); 

     String a = nl.item(0).getNodeValue(); 

URIでまだ動作しません。

+3

無関係ですが、世界的なエンコード関連の問題を減らすために、 'new ByteArrayInputStream(xml.getBytes())'を 'new InputSource(new StringReader(xml)) 'に置き換えることをお勧めします。 – Isaac

答えて

15

getElementsByTagNameNSは結果を保留中です。問題は、現在、結果要素からテキストコンテンツを取得するために間違ったメソッドを呼び出していることです。あなたはgetTextContext()を呼び出す必要はありませんgetNodeValue()

String a = nl.item(0).getTextContent(); 

DomDemo以下は、完全なコード例です。

package forum13166195; 

import java.io.StringReader; 
import javax.xml.parsers.*; 
import org.w3c.dom.*; 
import org.xml.sax.InputSource; 

public class DomDemo { 

    public static void main(String[] args) throws Exception{ 
     String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
        + "<ns1:schema xmlns:ns1='http://example.com'>" 
         + "<ns1:tag1>" 
          + "<ns1:tag2>value</ns1:tag2>" 
         + "</ns1:tag1>" 
        + "</ns1:schema>"; 

     DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
     docBuilderFactory.setNamespaceAware(true); 
     DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
     Document doc = docBuilder.parse(new InputSource(new StringReader(xml))); 

     NodeList nl = doc.getElementsByTagNameNS("http://example.com", "tag2"); 

     String a = nl.item(0).getTextContent(); 
     System.out.println(a); 
    } 

} 

出力

value 

別のアプローチは、

また、から値を照会する(上記のJava SE 5とに含まれる)javax.xml.xpath APIを使用することができますXML文書。これらのAPIは、getElementsByTagNameNSよりも多くの制御を提供します。

XPathDemo

package forum13166195; 

import java.io.StringReader; 
import java.util.Iterator; 
import javax.xml.namespace.NamespaceContext; 
import javax.xml.xpath.*; 

import org.xml.sax.InputSource; 

public class XPathDemo { 

    public static void main(String[] args) throws Exception{ 
     String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
        + "<ns1:schema xmlns:ns1='http://example.com'>" 
         + "<ns1:tag1>" 
          + "<ns1:tag2>value</ns1:tag2>" 
         + "</ns1:tag1>" 
        + "</ns1:schema>"; 

     XPath xpath = XPathFactory.newInstance().newXPath(); 
     xpath.setNamespaceContext(new NamespaceContext() { 

      public String getNamespaceURI(String arg0) { 
       if("a".equals(arg0)) { 
        return "http://example.com"; 
       } 
       return null; 
      } 

      public String getPrefix(String arg0) { 
       return null; 
      } 

      public Iterator getPrefixes(String arg0) { 
       return null; 
      } 

     }); 

     InputSource inputSource = new InputSource(new StringReader(xml)); 
     String result = (String) xpath.evaluate("/a:schema/a:tag1/a:tag2", inputSource, XPathConstants.STRING); 
     System.out.println(result); 
    } 

} 

出力

value 
+1

ありがとう男それは働く:) – user1512895

0

名前空間のURLを渡す必要があります。 XMLで作成したローカルエイリアスではありません。

0
Try this : 

    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
    docBuilderFactory.setNamespaceAware(true); 
    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
    Document doc = docBuilder.parse(new InputSource(new StringReader(xml)));  
    NodeList nodeList = doc.getElementsByTagNameNS("*", "tag2"); 
    String a = nodeList.item(0).getTextContent(); 
    System.out.println(a); 

出力

value 
関連する問題