DOM解析XML——初步(1)

在使用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解析都是作为子节点来看待的。无内容则表示无子节点。

 

 

 

 

 

 

你可能感兴趣的:(xml,AIR)