2012-11-15 136 views
2

我为xml页面编写了一个解析器,并且出现一个奇怪的错误,我完全不明白为什么。首先,我想告诉你,我的XML页面:尝试使用dom解析xml页面时出现空指针异常

<?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> 

在这里,你可以看到药物相互作用的标签和它里面大约有相互作用的药物信息。所以当我删除药物相互作用标签时,我的解析器完美地工作,但与药物相互作用标签,我得到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。

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

我注意到,当我将里面的“药物相互作用”标签名称,也就是我用“名”,而不是“名”和而不是“药”的药物相互作用里面的“药品”和它的工作。我不知道为什么我的解析器混淆。我检查了XML页面,有许多不同的标签叫做“名称”,但是它们不会给出任何错误 –

相关问题