2009-08-18 15 views
12
try { 
     String data = "<a><b c='d' e='f'>0.15</b></a>"; 
     DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory 
       .newInstance(); 
     DocumentBuilder documentBuilder = documentBuilderFactory 
       .newDocumentBuilder(); 
     InputSource is = new InputSource(); 
     is.setCharacterStream(new StringReader(data)); 
     Document document = documentBuilder.parse(is); 

     NodeList nl = document.getElementsByTagName("b"); 
     Node n = (Node) nl.item(0); 
     System.out.println(n.getNodeValue()); 
    } catch (Exception e) { 
     System.out.println("Exception " + e); 

    } 

0.15を印刷すると予想されますが、nullが出力されます。何か案は?DOMを使用してノード値を取得するJava XML解析

編集:このトリック

 if (n.hasChildNodes()) 
      System.out.println(n.getFirstChild().getNodeValue()); 
     else 
      System.out.println(n.getNodeValue()); 

答えて

6

は、Elementからではなく、ノードからそれを抽出してみました:an element in fact has no nodeValueので

try { 
    String data = "<a><b c='d' e='f'>0.15</b></a>"; 
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory 
      .newInstance(); 
    DocumentBuilder documentBuilder = documentBuilderFactory 
      .newDocumentBuilder(); 
    InputSource is = new InputSource(); 
    is.setCharacterStream(new StringReader(data)); 
    Document document = documentBuilder.parse(is); 

    NodeList nl = document.getElementsByTagName("b"); 
    Element el = (Element) nl.item(0); 
    Text elText = (Text) el.getFirstChild(); 
    String theValue = elText.getNodeValue(); 
    System.out.println(theValue); 
} catch (Exception e) { 
    System.out.println("Exception " + e); 
} 
+0

@mkal - 私はちょうど出力に代わり、テキストインスタンスののnodeValueを編集しましたの! – karim79

11

だこと。代わりに、子としてテキストノードがあり、それにはnodeValueが必要です。

つまり、要素ノードの最初の子にはgetNodeValue()が必要です。

彼らはあなたが先にリンクされたページから、ア・ラ・この何かをする必要があります。その場合には、最大サイズ、持っているそうであるように時々要素は、複数のテキスト・ノードが含まれています:

public static String getNodeValue(Node node) { 
    StringBuffer buf = new StringBuffer(); 
    NodeList children = node.getChildNodes(); 
    for (int i = 0; i < children.getLength(); i++) { 
     Node textChild = children.item(i); 
     if (textChild.getNodeType() != Node.TEXT_NODE) { 
      System.err.println("Mixed content! Skipping child element " + textChild.getNodeName()); 
      continue; 
     } 
     buf.append(textChild.getNodeValue()); 
    } 
    return buf.toString(); 
} 
+0

良い説明と、素晴らしい機能のおかげです。チャンピオンのように動作します。 –

3
System.out.println(n.getFirstChild().getNodeValue()); 
1

た場合をノードにはネストされた子孫がありません。n.getTextContent()よりもかなり優れています。

2
private String getTextValue(Element element, String string) { 
    String textVal = null; 
    NodeList nl = element.getElementsByTagName(string); 
    if(nl != null && nl.getLength() > 0) { 
     Element el = (Element)nl.item(0); 
     textVal = el.getFirstChild().getNodeValue(); 
    } 

    return textVal; 

} 
1

jOOXをコードを簡略化するために標準DOMのラッパーとして使用できます。

String data = "<a><b c='d' e='f'>0.15</b></a>"; 
String value = $(data).find("b").text(); 

またjOOXは、例えば、doubleにその値を変換する可能性があり:

Double value = $(data).find("b").text(Double.class); 
関連する問題