以相等的标签解析 xml 时出现 NullPointerException

Posted

技术标签:

【中文标题】以相等的标签解析 xml 时出现 NullPointerException【英文标题】:NullPointerException while parsing xml at equal tags 【发布时间】:2015-08-16 09:00:00 【问题描述】:

我的 XML 文件:

<job_id>000273E060E87000C0001323FA21427120150602153306</job_id>
<job_id>000273E060E87000C0001323FA21427120150602153342</job_id>
<job_id>000273E060E87000C0001323FA21427120150602153419</job_id>

我在这里得到一个 NullPointerException:

protected ArrayList<HashMap<String, String>> doInBackground(URL... urls) 
        if (cd.isConnectingToInternet()) 
            XMLParser xmlParser = new XMLParser();
            String xml = xmlParser.getXMLFromUrl("http://www.example.de/android.php?f=1200");
            Document doc = xmlParser.getDomElement(xml);
            writeToFile(xml, "xmlfilesnames");

            NodeList noteListFileNames = doc.getElementsByTagName("tasklist");

            for (int i = 0; i <= noteListFileNames.getLength(); i++) 

                HashMap<String, String> map = new HashMap<String, String>();
                Element e = (Element) noteListFileNames.item(i);

                map.put("job_id", xmlParser.getValue(e, "job_id"));
                xmlFileNames.add(map);

            

在:map.put("job_id", xmlParser.getValue(e, "job_id")); for 循环第二次运行时。

堆栈跟踪:

java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:300)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:841)
 Caused by: java.lang.NullPointerException
        at xmlParsing.XMLParser.getValue(XMLParser.java:88)
        at de.example.app.ListViewActivity$DownloadXMLFilesName.doInBackground(ListViewActivity.java:298)
        at de.example.app.ListViewActivity$DownloadXMLFilesName.doInBackground(ListViewActivity.java:281)
        at android.os.AsyncTask$2.call(AsyncTask.java:288)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)

           在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 在 java.lang.Thread.run(Thread.java:841)

XML 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<tasklist>
<job_id>000273E060E87000C0001323FA21427120150602153306</job_id>
<job_id>000273E060E87000C0001323FA21427120150602153342</job_id>
<job_id>000273E060E87000C0001323FA21427120150602153419</job_id>
</tasklist>

第一个循环

xml文件名:

000273E060E87000C0001323FA21427120150602153419

地图:

000273E060E87000C0001323FA21427120150602153419

第二次循环 xml文件名:

000273E060E87000C0001323FA21427120150602153342
000273E060E87000C0001323FA21427120150602153342

地图:

000273E060E87000C0001323FA21427120150602153342

第三循环

xml文件名

000273E060E87000C0001323FA21427120150602153419
000273E060E87000C0001323FA21427120150602153419
000273E060E87000C0001323FA21427120150602153419

地图:

000273E060E87000C0001323FA21427120150602153419

【问题讨论】:

请发布堆栈跟踪,因为我们还不知道 NPE 被准确抛出的位置。 哦,对不起...我已经发布了我的堆栈跟踪 【参考方案1】:

在for循环中应该小于不小于等于

for (int i = 0; i <= noteListFileNames.getLength(); i++)

应该是

for (int i = 0; i < noteListFileNames.getLength(); i++)

除了您的进一步问题:

尝试改变:

Element e = (Element) noteListFileNames.item(i);

map.put("job_id", xmlParser.getValue(e, "job_id"));
xmlFileNames.add(map);

到:

Element e = (Element) noteListFileNames.item(i);

NodeList children = e.getChildNodes();

for (int j = 0; j < children.getLength(); j++) 
    if (children.item(j).getNodeName().equals("job_id")) 
        map.put(children.item(j).getNodeName(),
        children.item(j).getTextContent());
        xmlFileNames.add(map);
    

或类似的东西。不确定您使用的是哪个解析器。

【讨论】:

它解决了我的 NPE 的问题,但我的 xmlFileNames 只有第一个 job_id...它只是循环一次 那是因为您发现只有一个 KEVOX_tasklist 元素。您也需要遍历作为 job_id 的兄弟姐妹 您确定要拉下整个 xml 文件吗? 更新了我的答案,因为它的格式更好 我希望你能帮助我,因为那不是正确的解决方案......如果我运行你的解决方案,我会得到最后一个 job_id 的 3 倍......在这种情况下,我会得到 3 倍...... ...3419 你能告诉我为什么吗?

以上是关于以相等的标签解析 xml 时出现 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

使用 WebLogic 解析 XML 时出现 ClassCastException

使用 XSL 解析 XML 时出现问题

在 Python 中解析 XML 时出现编码问题

为啥在android应用程序中解析xml时出现nullpointerexception?

从 ServletContext 资源解析 XML 文档时出现意外异常

尝试使用 dom 解析 xml 页面时出现空指针异常