开发者学堂课程【XML入门 :使用 JAXP 遍历节点】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/37/detail/855
使用 JAXP 遍历节点
1、需求是把 xml 中的所有元素名称打印出来。
2、p1 是 person 的子节点,name 是 p1 的子节点,首先获取它的根节点是 person,获取 person 的子节点,以此类推,就可以用递归,递归就是自己调用自己,比如写一个方法,一个节点为它的子节点依次调用这个方法,这可以做一个便利。
3、//遍历节点,把所有元素名称打印出来
throws 它的异常
public static void listElement( ) throws Exception{
前三步没有变化,还是一样。
/*
* 1、创建解析器工厂
* 2、根据解析器工厂创建解析器
* 3、解析 xml,返回 document
*
* ====使用递归实现=====
* 4、得到根节点
* 5、得到根节点子节点
* 6、得到根节点子节点的子节点
首先前三步直接拿过来,都是一样的。
//创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory . newInstance();
//创建解析器
DocumentBuilder builder = builderFactory . newDocumentBuilder();
/ /得到 document
Document document = builder . parse("src/person. xml");
//编写一个方法实现遍历操作
list1( document)
; 鼠标放在这会有提示,直接给显示出来,点击即可。
}
换成 node,node 是 document 父接口。
/ /递归遍历的方法
private static void list1(Node node) {
//得到一层子节点
NodeList list = node .getChildNodes();
属性是下面所有子节点,可以得到一层子节点,就是根节点,一层就是 person 下子节点有两个 p1,它能得到只是这两个 p1,name 得不到,p1 只能得到 name 和 age,一层子节点。
//遍历 list
for(int i=0;i<list. getLength();i++) {
//得到每一个节点
Node node1 = list. item(i);
/ /继续得到 node1 的子节点
//Node1.getChildNodes()
这样写没有意义,因为不知道它里面有多少层,这时候就可以用递归了
List1(node1)
;只是这里面还是要执行 getChildNodes 这个方法,只不是还可以直接来调用 list1,这就叫递归,自己来调用自己,执行的还是以上操作。
}
4、接下来打印节点的名称,可以直接来一个输出,写在的到一层子节点上面。getNodeName 名称
System.out. println(node . getNodeName()) ;
5、在遍历节点上输入 listELement() ;输入
6、看控制台上会有什么内容
#document
person
#text
p1
#text
#text
#text
age 首先标签输出来没有问题,但是多了很多其他的内容,解析会把里面的空格换行都当成内容,加了很多 #text,但是这些根本不需要,只需要元素的类型。
#text
#text
#text
p1
#text
name
#text
#text
age
#text
#text
#text
7、node.getNodeName
//判断是元素类型时候才打印
8、这个如何判断呢?看一下 node 里面有没有相关的属性或者方法,直接在jdk API 软件里输入 node 找属性和方法,找到 elenment node 就表示 elenment 就是一个元素,访问是一个 short,再看 test 里面访问也是 short ,判断两个相同它就打印,elenment node 这个属性的特点是静态,书写是类名加 elenment node,这么判断就可以。在 testjaxp.java 输入
if(node. getNodeType() == Node.ELEMENT _NODE) {
System.out. println(node . getNodeName()) ;
}
再打印元素名称,这样再执行看一下结果,再看一下有没有 #text。
打印结果:
person
p1
name
age
p1
name
Age
这回就没有 #text,这样就完成了遍历节点。
9、总结:
遍历的方法
//递归遍历的方法
private static void 1ist1 (Node node) {
//判断是元素类型时候才打印
if (node . getNodeType() == Node . ELEMENT NODE) {
System. out. println (node . ge tNodeName () ) ;
}
//得到一层子节点
NodeList list = node .getChidNodes( );
//遍历 list
for(int i=0;i<1ist.getLength();i++) {
//得到每一个节点
Node node1 = list.item(i) ;
//继续得到 node1 的子节点
//node1.getChildNodes ()
list1 (node1) ;
}
}
getChidNodes 方法表示获取子节点,只是获取一层的节点,遍历之后的到每一个节点,这时可以递归,可以调用这个方法,直接往下写,但是这么写没有意义,直接调用就可以,需求时打印出里面所有标签的名称,所以要做一个判断,判断它的类型,元素或标签类型,这时它才打印,如果不这么判断,它会把里面所以的元素,就是空格换行都打印出来,这时就需要做这么一个判断,这就是使用 jaxp 遍历节点的操作。