在使用DOM解析XML的时候,遇到一个问题:通过getNodeValue()获取节点value,但得到的却是"#text"和许多空格的问题,尝试之后,得到分析如下:
在DOM解析XML,如果用到了
NodeList nodeList = document.getElementsByTagName("tagName");
这样的方式来获取节点,并且用
nodeList.item(i).getFirstChild().getNodeValue()
这样的方式读取某个节点的值,需要注意一点的是,这里你传入的tagName必须是你要获取的值的当前节点,例如<info><name>java</name></info>,如果你要得到"java",这里传入的tagName就必须是name,而不能是info。传入info得到的value是"#text"。按照代码的理解,首先获取name节点,得到name节点的子节点并获得此节点的value——"java"。这里java虽然不是标签,但是仍然是以节点的方式来看待和读取的。
完整的代码如下:
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import java.io.File; public class XMLDemo1 { public static void main(String args[]) throws Exception{ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = builderFactory.newDocumentBuilder(); Document document = builder.parse(new File("E:"+File.separator+"java3"+File.separator+"XMLTest"+File.separator+"listData.xml")); NodeList nodeList = document.getElementsByTagName("image"); System.out.println(nodeList.getLength()); for(int i = 0; i < nodeList.getLength(); i++){ System.out.println("image:" + nodeList.item(0).getFirstChild().getNodeValue()) ; } } }
listData.xml:
<?xml version="1.0"?> <items> <item> <image>assets/icons/ce.jpg</image> </item> <item> <image>assets/icons/ai.jpg</image> </item> <item> <image>assets/icons/ps.jpg</image> </item> <item> <image>assets/icons/fw.jpg</image> </item> <item> <image>assets/icons/fl.jpg</image> </item> <item> <image>assets/icons/air.jpg</image> </item> </items>
输出结果可以看到得到了image标签的内容,但如果传入的是item,那么得到的就是"#text"和许多的空格。
在此,做另外一个尝试,Node类有一个方法"hasChildNodes()",用于判断这个Node是否有子节点。用这个方法判断<image>assets/icons/ce.jpg</image>和<image></image>是否有区别:
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import java.io.File; public class XMLDemo1 { public static void main(String args[]) throws Exception{ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = builderFactory.newDocumentBuilder(); Document document = builder.parse(new File("E:"+File.separator+"java3"+File.separator+"XMLTest"+File.separator+"listData.xml")); NodeList nodeList = document.getElementsByTagName("image"); System.out.println(nodeList.getLength()); for(int i = 0; i < nodeList.getLength(); i++){ System.out.println(nodeList.item(i).hasChildNodes()); } } }
listData.xml:
<?xml version="1.0"?> <items> <item> <image></image> </item> <item> <image>assets/icons/ai.jpg</image> </item> <item> <image></image> </item> <item> <image>assets/icons/fw.jpg</image> </item> <item> <image></image> </item> <item> <image>assets/icons/air.jpg</image> </item> </items>
运行之后可以发现结果如下:
false
true
false
true
false
true
由此可以知道,当标签中有内容时——无论是子标签还是value字符串,dom解析都是作为子节点来看待的。无内容则表示无子节点。