解析xml并打印出所有的属性名称和文本内容
1 test-a.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<result>
<man>
<name>sky</name>
<age>18</age>
<sex>1</sex>
</man>
</result>
2 java dom访问,主要功能是遍历xml文件并按层次打印出所有的节点名称和文本内容
package com.java.xml.dom;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* DOM是以层次结构组织的节点或信息片段的集合。
* 分析该结构通常需要 加载整个文档和构造层次结构。
* 由于它是基于层次结构的,因而DOM被认为是基于树或基于对象的。
* 优点:
* 因为DOM树是加载到内存中的,修改比较方便。
* 支持删除、修改、重新排列等多种功能
* 缺点:
* 将整个文档调入内存(包括无用的节点),浪费时间和空间;
* 使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
* @author Administrator
*
*/
public class DomA {
/**
* 控制台输出类
* @param s 要输出的字符
* @param level 层次
*/
public static void print(String s,int level)
{
String result = "";
for (int i = 0; i <level ;i++)
{
result = result + "----";
}
result = "level:"+level+":"+result + s;
System.out.println(result);
}
/**
* 循环解析xml对象的方法
* @param list
*/
public static void circle(NodeList list,int level)
{
NodeList childList = null;
for (int i = 0; i < list.getLength(); i++)
{
int newLevel = level;
Node node = list.item(i);
/**
* 如果是文本对象直接输出
* 忽略空白文本,dom解析时,getChildNodes会生成空白Node
*/
if (Node.TEXT_NODE == node.getNodeType() && !("").equals(node.getNodeValue().trim()))
{
newLevel = newLevel + 1;
print(node.getNodeValue()+"",newLevel);
}
//如果是对象类型
if (Node.ELEMENT_NODE == node.getNodeType())
{
newLevel = newLevel + 1;
print(node.getNodeName()+"",newLevel);
childList = node.getChildNodes();
//继续循环
circle(childList,newLevel);
}
}
}
/**
* dom解析
*/
public static void dom()
{
try
{
File xml = new File("D:/新的开始/学习笔记/java学习/xml解析/test-a.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(xml);
//doc根对象
Node root = doc.getDocumentElement();
//根节点子对象集合
NodeList list = root.getChildNodes();
circle(list,0);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
dom();
}
}
3 执行DomA对象的main方法,输出如下:
level:1:----man
level:2:--------name
level:3:------------sky
level:2:--------age
level:3:------------18
level:2:--------sex
level:3:------------1
4 注意点:
dom解析getChildNodes会生成空白Node,解析时需要注意。
举例1 :
<result>
<man>
<name>sky</name>
<age>18</age>
<sex>1</sex>
</man>
</result>
//doc根对象
Node root = doc.getDocumentElement();
//根节点子对象集合
NodeList list = root.getChildNodes();
那么list.getLength()值是什么呢?
不熟悉的人可能会认为是:1 ,其实实际答案是3 如下所示:
1 空白text-Node
2 element-Node
(
<man>
<name>sky</name>
<age>18</age>
<sex>1</sex>
</man>
)
3 空白text-Node
如果
NodeList list2 = doc.getElementsByTagName("man")
那么list2.getLength()值是什么呢?
答案是:1 这个不含有空白node
举例二:
<name>sky</name>
这个节点对象的getChildNodes().getLength()是几呢?答案是1 不包含空白节点
需要注意下。