解析XML

 Java会把开始和结束标签中的所有内容看成这个节点的子节点,文字类型的节点就会看成Text类型的节点,带标签的节点就会看出Element类型节点。所以空白和换行看成了一个子节点。

 

package com.wyl.parseXml;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/** 1.创建一个DocumentBuilderFactory对象
 *  2.创建一个DocumentBuilder对象
 *  3.通过DocumentBuilder对象的parse(String fileName)方法解析xml文件
 *  
 *  
 *  节点类型:Element,Attr,Text
 *     java程序在解析xml文档的时候会把myuser节点开始到结束中的所有类容都看成myuser的子节点。
 *     文字类型的会看出Text节点(空白和换行都当成了子节点)。带标签的会看成Element节点。
 * 
 * 
 *  为什么所有element类型的节点getNodeValue()是null?
 *     因为它只看节点标签,认为节点标签就是NodeName。而值是这个节点的子节点,所以说就要获取孙子节点的值
 */
public class DOMTest {

    public static void main(String[] args) {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//创建一个DocumentBuilderFactory的对象
        try {
            DocumentBuilder db = dbf.newDocumentBuilder();//创建一个DocumentBuilder的对象
                Document document = db.parse("user.xml");//通过DocumentBuilder的parse方法加载user.xml文件。
                NodeList myuserList = document.getElementsByTagName("myuser");//解析是通过实际的加载了user.xml文件的Document对象解析的。获取所有myuser节点的集合
                System.out.println("myuser节点的个数:"+myuserList.getLength());
                //遍历每一个myuser节点
                for (int i = 0; i < myuserList.getLength(); i++) {
                    System.out.println("======================第"+(i+1)+"层节点开始======================");
                    //通过 item(i)获取一个myuser节点
                    Node myuser = myuserList.item(i);//Node接收一下item的返回值
                    
                    /*1.解析节点的属性名和属性值*/
                    //遍历myuser的属性
                    NamedNodeMap attrs = myuser.getAttributes();//获取的就是myuser节点中所有的属性值。NamedNodeMap存储所有myuser属性的集合
                    System.out.println("第"+(i+1)+"层的节点的属性的个数是:"+attrs.getLength());
                    for (int j = 0; j < attrs.getLength(); j++) {
                        System.out.println("       第"+(i+1)+"层的第"+(j+1)+"个节点的属性名和属性值的开始");
                        Node attr = attrs.item(j);
                        String name = attr.getNodeName();
                        String value = attr.getNodeValue();
                        System.out.println("               第"+(i+1)+"层的第"+(j+1)+"个节点的节点名是:"+name+" 节点值是:"+value);
                        System.out.println("       第"+(i+1)+"层的第"+(j+1)+"个节点的属性名和属性值的结束");
                    }
                    
                    /*1.解析节点的节点名和节点值*/
                    //解析myuser节点的子节点
                    NodeList childNodes = myuser.getChildNodes();
                    //遍历childNodes获取每个节点的节点名和节点值
                    System.out.println("&&&&&第"+(i+1)+"层节点的子节点个数:"+childNodes.getLength());
                    for (int j = 0; j < childNodes.getLength(); j++) {
                        //区分出text类型的node以及element类型的node
                        if(childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
                            Node element = childNodes.item(j);
                            String childNodeName = element.getNodeName();
                            String childNodeValue = element.getFirstChild().getNodeValue();
//                            String childNodeValue = element.getTextContent();
                            System.out.println("*****&&&&&^^^^^^"+childNodeName);
                            System.out.println("*****&&&&&^^^^^^"+childNodeValue);
                        }
                        
                    }
                    
                    /*2.解析节点的属性名和属性值*/
                    //知道节点属性的名字
                    /*Element myuser = (Element) myuserList.item(i);
                    String attrValue = myuser.getAttribute("id");
                    System.out.println("id属性的属性值为"+attrValue);*/
                    System.out.println("======================第"+(i+1)+"层节点结束======================");
                }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        }
        

    }

}

 

posted @ 2019-10-10 20:51  wyl677  阅读(163)  评论(0编辑  收藏  举报