Dom解析xml,只是简单的解析出有效元素的元素名,元素值,属性名和属性值

DOM使用简单,但只适合于一些小的Xml文档,因为Dom解析Xml文档时,要将其读入内存,生成DOM树。

具体操作方法如下

要解析的XML文档

<persons>
    <person id="1001">
        <name><![CDATA[<>上上</>]]></name> <!--  <![CDATA[<>上上</>]]> 预定义字符3.
        -->
        <sex>男</sex>
        <mobile>123456</mobile>
        <address>
            <country>中国</country>
            <province>湖南</province>
            <city>衡阳</city>
        </address>    
    </person>
    <person id="1002">
        <name>tom</name>
        <sex>女</sex>
        <mobile>654321</mobile>
        <address>
            <country>美国</country>
            <province>纽约</province>
            <city>不知道</city>
        </address>    
    </person>
</persons>

DOM解析

package com.yc.xml.study01;

import java.io.FileInputStream;
import java.io.InputStream;

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

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DOMParseDemo01{
    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//文档构建工厂对象
        DocumentBuilder  builder=factory.newDocumentBuilder();//
        InputStream in=new FileInputStream("study/study01.xml");//读取xml文件数据流
        Document doc=builder.parse(in);//加载xml文件数据流,通过文档构建对象,构建出树状结构的文档对象
        
        Node headNode=doc.getDocumentElement();//取到根节点
        listAllChildNodes(headNode, 0);
    }

    private static void listAllChildNodes(Node node, int level) {
        // TODO Auto-generated method stub
        if (node.getNodeType() == Node.ELEMENT_NODE) {
             System.out.println("+++++++++++++++++"+node.getNodeName()+"+++++++++++++++"+node.getFirstChild().getNodeValue());//打印出元素名,元素值
             if (node.hasAttributes()) { //判断该节点是否有属性
                    NamedNodeMap nnmap = node.getAttributes();  //获取属性
                    for (int i = 0; i < nnmap.getLength(); i++) {  
                        System.out.println(nnmap.item(i).getNodeName()  + nnmap.item(i).getNodeValue());//打印出属性名,属性值
                    }
             }
             if(node.hasChildNodes()){//如果这个节点有子节点
                 NodeList nodelist = node.getChildNodes(); //取到所有子节点并存到一个数组里,NodeList可以看成一个数组
                 level++;
                 for (int i = 0; i < nodelist.getLength(); i++) {  
                     if (nodelist.item(i).getNodeType() == Node.ELEMENT_NODE) {//判断这个节点是否是有效的节点
                        // 递归调用方法 - 以遍历该节点下面所有的子节点  
                        listAllChildNodes(nodelist.item(i), level);// level表示该节点处于第几个层次(相应空格)  
                     }  
                 }
                 level--;
             }
        }
    }
}

运行结果:

 

转载于:https://www.cnblogs.com/yongguolong/p/7400380.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值