XML转Java解析问题:NodeList长度为0及空指针异常求助
XML解析问题排查与修复方案
先来看你提供的XML示例:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> <message> <id>ce8140c2-14e2-418b-8150-9face6a1aa33</id> <company>Plostation</company> <content>rovetguekh</content> </message>
结合你遇到的问题和代码,我来拆解根源并给出修复方案:
问题根源分析
1. getElementsByTagName("message")返回长度为0
你打印的Root element应该就是message,因为这段XML的根节点就是<message>。而docEle本身就是这个根元素,调用它的getElementsByTagName("message")是在查找它的子节点中名为message的元素,但你的XML里根节点下并没有子<message>节点,所以自然返回空列表。
2. 改用getChildNodes()后出现NullPointerException
getChildNodes()会返回所有子节点,包括XML中的换行、空格这些文本节点,你拿到的3个节点里其实混合了文本节点和真正的元素节点(<id>、<company>、<content>)。当你把文本节点强转为Element后,调用getElementsByTagName("id")会返回null,再调用item(0)就触发了空指针异常。
修复后的完整代码
直接操作根节点docEle即可,同时增加空指针防护,替换过时的输入流:
try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); // 替换过时的StringBufferInputStream,指定UTF-8编码避免乱码 Document dom = db.parse(new ByteArrayInputStream(currentLine.getBytes(StandardCharsets.UTF_8))); Element docEle = dom.getDocumentElement(); docEle.normalize(); logger.info("Root element :" + docEle.getNodeName()); // 根节点就是我们要的<message>元素,直接处理它的子元素 if (docEle.getNodeType() == Node.ELEMENT_NODE) { // 获取并设置id Node idNode = docEle.getElementsByTagName("id").item(0); if (idNode != null) { String convertName = idNode.getTextContent(); UUID name = UUID.fromString(convertName); message.setId(name); } // 获取并设置company Node companyNode = docEle.getElementsByTagName("company").item(0); if (companyNode != null) { message.setCompany(companyNode.getTextContent()); } // 获取并设置content Node contentNode = docEle.getElementsByTagName("content").item(0); if (contentNode != null) { message.setContent(contentNode.getTextContent()); } logger.debug(message.getId() + " " + message.getCompany() + " " + message.getContent()); messagelist.add(message); } } catch (Exception e) { logger.error("XML解析出错", e); }
额外优化说明
- 替换了过时的
StringBufferInputStream为ByteArrayInputStream,并显式指定UTF-8编码,避免因默认编码导致的乱码问题。 - 增加了
idNode、companyNode等的空指针判断,即使XML节点缺失也不会直接崩溃,提升了代码健壮性。 - 原代码中
messageListNodes.item(1).getTextContent()的写法非常不可靠,因为getChildNodes()的节点顺序和类型不确定,通过标签名获取子元素是更稳妥的方式。
内容的提问来源于stack exchange,提问作者Bav
相关产品推荐
相关产品推荐

