java使用document解析xml文件

准备工作:

1创建java工程

2创建xml文档。

完成后看下面代码:

import org.w3c.dom.*;

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

public class Main {

    public static void main(String[] args)  throws Exception {
        //创建一个文档解析器工厂
        DocumentBuilderFactory fac= DocumentBuilderFactory.newInstance();

        //用上面的工厂创建一个文档解析器
        DocumentBuilder builder=fac.newDocumentBuilder();

        //用上面的文档解析器解析一个文件放到document对象里
        Document doc=builder.parse("src/server.xml");

        //获取文档中节点名称为Listener的所有节点,并返回一个节点集合
        NodeList listenerList=doc.getElementsByTagName("Listener");
        System.out.println("一共有"+listenerList.getLength()+"个节点");

        //遍历整个集合(把所有标签名为Listener的节点一个一个拿出来
        for (int i=0;i<listenerList.getLength();i++){
            System.out.println("===========这是第"+(i+1)+"个listener节点的开始:===========");
            //把集合里的每一个listener节点分别拿出来
            Node node=listenerList.item(i);
            //再把上一个节点中的所有属性拿出来
            NamedNodeMap nodeMap= node.getAttributes();
            System.out.println("第"+(i+1)+"个节点一共有"+nodeMap.getLength()+"个属性");

            //遍历所有属性
            for(int j=0;j<nodeMap.getLength();j++){
                Node node1=nodeMap.item(j);
                System.out.println("第"+(j+1)+"个属性的名称是"+node1.getNodeName());
                System.out.println("第"+(j+1)+"个属性的值是"+node1.getNodeValue());
            }
//获取节点的所有子节点,注意会把所有换行符也解析为子节点
NodeList childNode=node.getChildNodes();

//遍历所有子节点
for(int k=0;k<childNode.getLength();k++){
if(childNode.item(k).getNodeType()==Node.ELEMENT_NODE){
//这个过滤条件是只将标签节点保留(换行符的节点就删去)
}
System.out.println(
"===========这是第"+(i+1)+"个节点的结束:==========="); } } }

为了方便记忆,在这里拆解一下。我们的目的是解析一个xml文档,所以就需要一个工具。这个工具就叫做DocumentBuilder类的对象,那么这个工具怎么来的呢?是从工厂里面生产出来的,那么工厂怎么来的呢?就得先创建一个工厂:DocumentBuilderFactory。在本例中解析了xml文档中所有名为Listener标签的所有属性。

本人其实非常渴望研究更深入的东西,但现在实在是刚毕业,么办法,所以只能研究研究一些场景怎么用,怎么解析xml文档,至于到底内部是如何实现的,希望各位读者有时间一定要深究下去,这里可能涉及到java的动态代理和工厂模式。

注意:1.<book>红楼梦</book>,当获取到book节点时,其节点名称是book,值是null!!!。因为解析过程中把红楼梦作为book节点的子节点解析。所以要想获取红楼梦,就必须在book节点处获取第一个子节点。也可以用book节点获取textContent(获取该节点下及其子节点孙节点所有的文本节点内容)。

原文地址:https://www.cnblogs.com/xiaoao/p/9612928.html