在学习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,实际运用中有很多方法,这里不再陈列。