简体   繁体   中英

nullpointerexception while trying to read from xml file with dom parser

I am trying to read from xml file but I get a null pointer exception. this is the xml file:

<war>
    <missileLaunchers> 
        <launcher  id="L101" isHidden="false">
            <missile  id="M1" destination="Sderot" launchTime="2" flyTime="12" damage="1500"/>
            <missile id="M2" destination="Beer-Sheva" launchTime="5" flyTime="7" damage="2000"/>
        </launcher>
        <launcher id="L102" isHidden="true">
            <missile id="M3" destination="Ofakim" launchTime="4" flyTime="3" damage="5000"/>
            <missile id="M4" destination="Beer-Sheva" launchTime="9" flyTime="7" damage="1000"/>
        </launcher>
    </missileLaunchers>
    <missileDestructors >
        <destructor  id="D201">
            <destructdMissile  id="M1" destructAfterLaunch="4"/>
            <destructdMissile id="M3" destructAfterLaunch="7" />
            <destructdMissile id="M4" destructAfterLaunch="2"/>
        </destructor>
        <destructor id="D202">
            <destructdMissile id="M2" destructAfterLaunch="3"/>
        </destructor>
    </missileDestructors>
    <missileLauncherDestructors >
        <destructor type="plane" >
            <destructedLanucher  id="L101" destructTime="4"/>
        </destructor>
        <destructor type="ship">
            <destructedLanucher id="L102" destructTime="8" />
            <destructedLanucher id="L102" destructTime="12"/>
        </destructor>
    </missileLauncherDestructors>
</war>

and this is the code:

public class XmlReader
{

File fXmlFile=null; 
DocumentBuilderFactory dbFactory=null;
DocumentBuilder dBuilder=null;
Document doc=null;

public XmlReader(String filePath) throws ClassNotFoundException
{
    if(filePath!=null)
    {
        this.fXmlFile = new File(filePath);     

        dbFactory = DocumentBuilderFactory.newInstance();
        try {
            dBuilder = dbFactory.newDocumentBuilder();
        } catch (ParserConfigurationException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            doc = dBuilder.parse(fXmlFile);
            doc.getDocumentElement().normalize();
        } catch (SAXException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    else System.out.println("Xml file not found");

}
//gets value by tag name
private static String getTagValue(String tag, Element element) {

    if(element.hasChildNodes())
    {
        NodeList nodeList = element.getElementsByTagName(tag).item(0).getChildNodes();          
        Node node = (Node) nodeList.item(0);
        if(node==null)
            return null;
        return node.getNodeValue();
    }

    else return element.getNodeValue();

}

//launcher
public List<Launcher> readLauncher() throws Exception
{           
    List<Launcher> launcherList = new ArrayList<Launcher>();
    try
    {
        NodeList nList = doc.getElementsByTagName("launcher");

        for(int i=0;i<nList.getLength();i++)
        {launcherList.add(getLauncher(nList.item(i)));}
    }

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

//builds the object
private static Launcher getLauncher(Node node) 
{
    //XMLReaderDOM domReader = new XMLReaderDOM();
    Launcher launcher = new Launcher();
    if (node.getNodeType() == Node.ELEMENT_NODE)
    {
        Element element = (Element) node;                     
        //   launcher.setIsHidden(Boolean.parseBoolean(getTagValue("isHidden", element)));
        //   launcher.setId(getTagValue("id", element));
        System.out.println("id = "+getTagValue("id", element));
        System.out.println("ishidden = "+getTagValue("isHidden", element));     
    }

    return launcher;
 }
}

And this is the stack trace:

java.lang.NullPointerException
    at XmlReader.getTagValue(XmlReader.java:56)
    at XmlReader.getLauncher(XmlReader.java:96)
    at XmlReader.readLauncher(XmlReader.java:78)
    at Program.main(Program.java:27)

I can not change the format of the xml file. It seems to fail when it tries to get the actual value of the node's fields or so I assume. Though I don;t understand the reason...when I check the size of the node list it turns fine it does give me 2.

You are calling getElementsByTagName() in getTagValues, however you are trying to retrieve attributes of the tag. You may need to call getAttribute() instead. For Example:

element.getAttribute(attributeName)

where attributeName is "id" or "isHidden". This will return the value as a String and can be returned directly with no further processing.

The problem is below line:

 System.out.println("id = " + getTagValue("id", element));

where getTagValue("id", element) is calling

NodeList nodeList = element.getElementsByTagName(tag).item(0).getChildNodes();

Here element.getElementsByTagName("id") will return null

It should be get from attribute

// gets value by tag name
private static String getTagValue(String tag, Element element) {
    return element.getAttributeNode(tag).getValue();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM