菜鸟学习笔记2:Dom解析xml时:getNodeValue()返回值为空。

在学习DOM解析XML时遇到getNodeValue()返回空或抛NullPointerException的问题。通过理解XML的树状结构,发现name节点的值'java'是文本节点,而空格、换行被视为额外的节点。修正代码后成功获取到值,强调理解数据结构的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习DOM解析XML的内容时,最先学习了读取XML中的内容,但是利用getNodeValue()方法时,常常获得null;要不然就是报NullPointerException空指针错误。于是我就查阅了相关的内容,将这个知识点总结一下。首先贴出我的XML中的内容:

<?xml version="1.0" encoding="UTF-8"?>
<Languages cat="it">
	<lan id="1">
		<name>Java</name>
		<ide>Eclipse</ide>
	</lan>
	<lan id="2">
		<name>Swift</name>
		<ide>Xcode</ide>
	</lan>
	<lan id="3">
		<name>C#</name>
		<ide>Visual Studio</ide>
	</lan>
</Languages>

我要获取name节点中的java,于是我写了以下代码:

public class ReadXML {

	public static void main(String[] args) {

		try {
			// 读取languiages.xml的内容
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse(new File("languages.xml"));
			// 获取标签为lan的节点集合
			NodeList list = document.getElementsByTagName("lan");
			//输出第一个节点的name值Java
			System.out.println("-------输出内容---------");
			System.out.println("name的值="+list.item(0).getFirstChild().getNodeValue());

		} catch (ParserConfigurationException | SAXException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

输出内容如下:
-------输出内容---------
name的值=

没有得到我想要的Java这个值,于是我开始查找资料,首先重新认识了xml的树状结构,本xml文件的树状结构如下所示:
在这里插入图片描述
name中的java也属于一个节点,是文本节点,所以根据结构特点,我修改了代码:

public class ReadXML {

	public static void main(String[] args) {

		try {
			// 读取languiages.xml的内容
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse(new File("languages.xml"));
			// 获取标签为lan的节点集合
			NodeList list = document.getElementsByTagName("lan");
			//输出第一个节点的name值Java
			System.out.println("-------输出内容---------");
			System.out.println("name的值="+list.item(0).getFirstChild().getFirstChild().getNodeValue());

		} catch (ParserConfigurationException | SAXException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

在这里插入图片描述却出现了空指针异常,于是我又开始查找资料,原来xml中把空格、tab、回车都当成node,所以系统无法输出预定的值。我改进了一下代码,同时验证回车当作node的说法:

public class ReadXML {

	public static void main(String[] args) {

		try {
			// 读取languiages.xml的内容
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse(new File("languages.xml"));
			// 获取标签为lan的节点集合
			NodeList list = document.getElementsByTagName("lan");
			//输出第一个节点的name值Java
			System.out.println("-------输出内容---------");
	        NodeList cList=list.item(0).getChildNodes();
			System.out.println("第一个lan下子节点的个数="+cList.getLength());
			//第一个节点是回车,所以name应该是第二个节点
			System.out.println("name的值="+cList.item(1).getFirstChild().getNodeValue());

		} catch (ParserConfigurationException | SAXException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

在这里插入图片描述
因此验证了回车也是一个node的说法,第一个lan中的5个节点分别为:
1、回车
2、name
3、回车
4、ide
5、回车
至此完成了获取第一个name节点存储的值“java”,在此次学习过程中主要遇到了一个难点:数据的结构!
以上的代码仅作为帮助了解xml中数据结构的简单demo,实际运用中有很多方法,这里不再陈列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值