2011-05-08 4 views
0

java를 사용하여 XML file을 읽으려고합니다. 파일을 성공적으로 읽을 수는 있지만 문제는 열 태그 내부의 값을 읽는 방법을 모르겠습니다.Java를 사용하여 XML 내용 읽기

열 태그가 고유하지 않으므로 읽는 방법을 모릅니다. 누군가 나를 도울 수 있습니까?

미리 감사드립니다.

import java.net.URL; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

public class XMLReader { 

public static void main(String argv[]) { 

    try { 
     //new code 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(new URL("http://www.cse.lk/listedcompanies/overview.htm?d-16544-e=3&6578706f7274=1").openStream()); 

     doc.getDocumentElement().normalize(); 
     System.out.println("Root element " + doc.getDocumentElement().getNodeName()); 
     NodeList nodeLst = doc.getElementsByTagName("row"); 
     System.out.println("Information of all Stocks"); 

     for (int s = 0; s < nodeLst.getLength(); s++) { 

     Node fstNode = nodeLst.item(s); 

     if (fstNode.getNodeType() == Node.ELEMENT_NODE) { 

      Element fstElmnt = (Element) fstNode; 
      //NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("column"); 
      //Element fstNmElmnt = (Element) fstNmElmntLst.item(0); 
      //NodeList fstNm = fstNmElmnt.getChildNodes(); 
      //System.out.println("First Tag : " + ((Node) fstNm.item(0)).getNodeValue()); 
      NodeList lstNmElmntLst = fstElmnt.getElementsByTagName("column"); 
     // Element lstNmElmnt = (Element) lstNmElmntLst.item(0); 

      for (int columnIndex = 0; columnIndex < lstNmElmntLst.getLength(); columnIndex++) { 
       Element lstNmElmnt = (Element) lstNmElmntLst.item(columnIndex); 
       NodeList lstNm = lstNmElmnt.getChildNodes(); 
       System.out.println("Last Tag : " + ((Node) lstNm.item(0)).getNodeValue()); 
       } 

     } 

     } 
     } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

답변

1

당신은 지금에 NPE 얻을 :

<column/> 

을 당신은 요소 0 얻기 전에 목록 크기를 확인해야합니다 : 당신은 노드의 텍스트 내용을 처리하고로

NodeList lstNm = lstNmElmnt.getChildNodes(); 
if (lstNm.getLength() > 0) { 
    System.out.println("Last Tag : " + ((Node)lstNm.item(0)).getNodeValue()); 
} else { 
    System.out.println("No content"); 
} 

을 그리고 , the answer to this SO question을보십시오.

<foo> 
    a 
    b 
    c 
</foo> 

이 수 또는 foo는 하나 개 이상의 자식 노드입니다 수 있으며, getTextContent() 고통을 조금 완화 할 수 있습니다로 텍스트 노드는 irriting된다.

2

이 코드 :

NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("column"); 

반환 열 노드의 목록, 왜 그냥 그들 모두를 반복하는 대신 단지 첫 번째를 읽기 위해 루프를 사용합니까?

for (int columnIndex = 0; columnIndex < fstNmElmntLst.getLength(); columnIndex++) { 
Element fstNmElmnt = (Element) fstNmElmntLst.item(columnIndex); 
... 
} 
+0

코드를 사용자의 주장대로 변경했지만 지금은 널 포인트를 인쇄합니다. System.out.prinln 줄은 널 포인트를 인쇄합니다. 위의 업데이트 된 코드를 확인하십시오. please –

+0

extraneon에서 다른 응답을 참조하십시오! –