2012-11-15 2 views
2

xml 페이지에 대한 구문 분석기를 작성했는데 그 이유를 완전히 이해하지 못하는 이상한 오류가 발생합니다.dom을 사용하여 xml 페이지를 구문 분석하려고 할 때 null 포인터 예외가 발생합니다.

<?xml version="1.0" encoding="UTF-8"?> 
<drugs xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://drugbank.ca" xs:schemaLocation="http://www.drugbank.ca/docs/drugbank.xsd" schemaVersion="1.4"> 
<drug type="biotech" created="2005-06-13 07:24:05 -0600" updated="2012-02-13 17:42:20 -0700" version="3.0"> 
<drugbank-id>DB00001</drugbank-id> 
<name>Lepirudin</name> 
<drug-interactions> 
    <drug-interaction> 
    <drug>DB01381</drug> 
    <name>Ginkgo biloba</name> 
    <description>Additive anticoagulant/antiplatelet effects may increase bleed risk. Concomitant therapy should be avoided.</description> 
    </drug-interaction> 
    <drug-interaction> 
    <drug>DB00374</drug> 
    <name>Treprostinil</name> 
    <description>The prostacyclin analogue, Treprostinil, increases the risk of bleeding when combined with the anticoagulant, Lepirudin. Monitor for increased bleeding during concomitant thearpy. </description> 
    </drug-interaction> 
</drug-interactions> 
<targets> 
    <target partner="54"> 
    <actions> 
     <action>inhibitor</action> 
    </actions> 
    </target> 
</targets> 
    </drug> 
<partners> 
<partner id="54"> 
    <name>Prothrombin</name> 
    <general-function>Involved in blood clotting cascade</general-function> 
</partner> 
    </partners> 
다음

, 당신은 약물 상호 작용 태그를 볼 수 있고 그 안에 상호 작용 약물에 대한 정보가있다 : 첫째로 나는 당신에게 내 XML 페이지를 표시 할. 그래서 약물 상호 작용 태그를 제거하면 파서가 완벽하게 작동하지만 약물 상호 작용 태그가 있으면 NullPointerException이 발생합니다.

오류 라인 :

if(nameElement.getChildNodes().item(0).getNodeValue().equals(str)) 

내가 여기 파서의 전체 코드를 걸었습니다. 직접 시도해 볼 수도 있습니다. 이 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까? 긴 게시물에 대해 유감입니다. 감사합니다

import java.io.File; 
import java.util.ArrayList; 
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 xmlParser { 

public static void main(String argv[]) { 
    getDrug("Lepirudin"); 
} 


public static void getDrug(String str){ 
    ArrayList<String> arr = new ArrayList(); 
    String trgts = ""; 
    try { 
     File file = new File("test.xml"); 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(file); 
     doc.getDocumentElement().normalize(); 
     System.out.println("Root element " + doc.getDocumentElement().getNodeName()); 

     NodeList drugList = doc.getElementsByTagName("drug"); 

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

      Node drugNode = drugList.item(s); 

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

       Element drugElement = (Element) drugNode; 

       Element nameElement = (Element) drugElement.getElementsByTagName("name").item(0); 

       if(nameElement.getChildNodes().item(0).getNodeValue().equals(str)){ 
        System.out.println("Name : " + nameElement.getChildNodes().item(0).getNodeValue()); 


        Element drugNodeElement = (Element) drugElement.getElementsByTagName("drugbank-id").item(0); 
        System.out.println("ID : " + drugNodeElement.getChildNodes().item(0).getNodeValue()); 

        ///////////////////////////////////////////////// 
        NodeList targetList = (NodeList) drugElement.getElementsByTagName("target"); 
        for(int t=0; t<targetList.getLength(); t++)  
        { 
         Node targetNode = targetList.item(t); 
         if(targetNode.getNodeType() == Node.ELEMENT_NODE) 
         { 
          Element targetElement = (Element) targetNode; 


          if(targetElement.getAttribute("position").equals("")) 
          { 
           System.out.println("target partner: " + targetElement.getAttribute("partner")); 
          } 
          else 
          { 
           System.out.println("target position: "+ targetElement.getAttribute("position")+ "target partner: "+ targetElement.getAttribute("partner")); 

          } 
          arr.add(targetElement.getAttribute("partner")); 

         } 
        } 

        System.out.println("-------------------------"); 

       } 
      } 

     } 
     NodeList partnersList = doc.getElementsByTagName("partners"); 

     for (int q = 0; q < partnersList.getLength(); q++) 
     { 

      Node partnersNode = partnersList.item(q); 
      if (partnersNode.getNodeType() == Node.ELEMENT_NODE) { 
       Element partnersElement = (Element) partnersNode; 
       NodeList partnerList = (NodeList) partnersElement.getElementsByTagName("partner"); 


       for(int w=0; w<partnerList.getLength(); w++)   
       { 

        Node partnerNode = partnerList.item(w); 
        if(partnerNode.getNodeType() == Node.ELEMENT_NODE) 
        { 
         Element partnerElement = (Element) partnerNode; 

         if(arr.contains(partnerElement.getAttribute("id"))){ 
          Element partnernameElement = (Element) partnerElement.getElementsByTagName("name").item(0); 
          trgts += partnernameElement.getChildNodes().item(0).getNodeValue() + "," ; 
         } 
        } 
       } 
      } 

     } 

     trgts = trgts.substring(0, trgts.length()-1); 
     System.out.println(trgts); 

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


} 

답변

0

null 포인터 예외는 널 포인터에서 함수를 실행하려고했음을 의미합니다. 내가 한 제안은 메모가 얼마나 멀리 있는지 파악하는 것입니다. 널 (NULL)이 _ 생하는 f}을 알아낼 때까지 각 함수 호출을 한 x에 하나씩 제거하고 값이 널을 리턴하는 이유를 알아낼 수 있는지 확인하십시오.

+0

"약물 상호 작용"내에서 태그 이름을 변경하면 약물 상호 작용 내에서 "약물"대신 "이름"과 "약물"대신 "이름"을 사용하고 작동하는 것으로 나타났습니다. 왜 파서가 혼란스러워하는지 모르겠다. xml 페이지를 검사 한 결과, "name"이라는 태그가 많이 있지만, 오류가 발생하지 않았습니다. –

관련 문제