java - 尝试使用 dom 解析器读取 xml 文件时出现 nullpointerException

标签 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。

最佳答案

问题在下面一行:

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

关于java - 尝试使用 dom 解析器读取 xml 文件时出现 nullpointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24854100/

相关文章:

java - 您需要将 APK 文件大小减小到 100MB 或使用 APK 扩展文件

java - 将 HttpServletRequest 注入(inject) Controller

php - 服务器端的 CURL HTTP 身份验证

javascript - JSON CSS 解析器

java - 创建无限的字典或列表

java - 在 phpmyAdmin 中验证用户名和密码

c# - Web 服务方法 - 无法序列化,因为它没有无参数构造函数

c# - XML 反序列化 - 不需要 xmlns

xml - 我不想解析 XML 中的某些标签

parsing - 如何用秒差距解析这个语法? (左递归的异常情况)