在学习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 {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("languages.xml"));
NodeList list = document.getElementsByTagName("lan");
System.out.println("-------输出内容---------");
System.out.println("name的值="+list.item(0).getFirstChild().getNodeValue());
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
输出内容如下:
-------输出内容---------
name的值=
没有得到我想要的Java这个值,于是我开始查找资料,首先重新认识了xml的树状结构,本xml文件的树状结构如下所示:

name中的java也属于一个节点,是文本节点,所以根据结构特点,我修改了代码:
public class ReadXML {
public static void main(String[] args) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("languages.xml"));
NodeList list = document.getElementsByTagName("lan");
System.out.println("-------输出内容---------");
System.out.println("name的值="+list.item(0).getFirstChild().getFirstChild().getNodeValue());
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
却出现了空指针异常,于是我又开始查找资料,原来xml中把空格、tab、回车都当成node,所以系统无法输出预定的值。我改进了一下代码,同时验证回车当作node的说法:
public class ReadXML {
public static void main(String[] args) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("languages.xml"));
NodeList list = document.getElementsByTagName("lan");
System.out.println("-------输出内容---------");
NodeList cList=list.item(0).getChildNodes();
System.out.println("第一个lan下子节点的个数="+cList.getLength());
System.out.println("name的值="+cList.item(1).getFirstChild().getNodeValue());
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();

因此验证了回车也是一个node的说法,第一个lan中的5个节点分别为:
1、回车
2、name
3、回车
4、ide
5、回车
至此完成了获取第一个name节点存储的值“java”,在此次学习过程中主要遇到了一个难点:数据的结构!
以上的代码仅作为帮助了解xml中数据结构的简单demo,实际运用中有很多方法,这里不再陈列。
在学习DOM解析XML的内容时,最先学习了读取XML中的内容,但是利用getNodeValue()方法时,常常获得null;要不然就是报NullPointerException空指针错误。于是我就查阅了相关的内容,将这个知识点总结一下。首先贴出我的XML中的内容:<?xml version="1.0" encoding="UTF-8"?><Languages cat="it"...
<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<User>
<city country="中国">南京</city>
<name>刘文
xml。。。。很常用,写个配置文件、传个平台无关的数据。。。很常见
但是为这些xml编写规范的DTD或者schema的。。。不太常见。。因为太麻烦。。。xml人人都看得懂,费那劲干嘛。。。。
以前都用dom4j之类的框架,好用。。。随便用。。。
后来用不了了,老老实实拿org.w3c.dom来写。。。
比如这个xml:
admin
太简单了:
Docu...
Java中可以使用XPath来获取XML文档中节点的值。
首先,需要创建一个`javax.xml.xpath.XPath`对象,然后使用`XPathExpression`来编译XPath表达式,最后使用`XPathExpression.evaluate`方法来执行XPath表达式并获取节点的值。
例如,下面的代码演示了如何使用XPath获取XML文档中的节点值:
```java
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
// ...
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
// 编译XPath表达式
XPathExpression expr = xpath.compile("/root/node/text()");
// 执行XPath表达式并获取节点列表
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
// 遍历节点列表并输出节点的值
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue());
其中,`doc`是一个`org.w3c.dom.Document`对象,表示XML文档。
注意,需要导入以下依赖才能使用上述代码:
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;