尝试使用dom解析器从xml文件读取时的nullpointerexception

时间:2014-07-20 19:28:55

标签: java xml parsing dom

我试图从xml文件中读取但我得到一个空指针异常。 这是xml文件:

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

这是代码:

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;
 }
}

这是堆栈跟踪:

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)

我无法更改xml文件的格式。 当它试图获取节点字段的实际值时似乎失败了,所以我假设。 虽然我不明白原因......当我检查节点列表的大小时它变好了它确实给了我2。

2 个答案:

答案 0 :(得分:1)

您正在getTagValues中调用getElementsByTagName(),但是您正在尝试检索标记的属性。您可能需要调用getAttribute()。例如:

element.getAttribute(attributeName)

其中attributeName是&#34; id&#34;或者&#34;隐藏&#34;。这将以String形式返回值,并且可以直接返回而无需进一步处理。

答案 1 :(得分:1)

问题出在以下方面:

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

getTagValue("id", element)正在调用

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

此处element.getElementsByTagName("id")将返回null

应该从属性

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