DOM方式解析XML文档 解析器Parser;三种Node区别 ElementNode AttributeNode TextNode

来源:互联网 发布:电气图设计软件 编辑:程序博客网 时间:2024/05/29 09:14

目标:解析books.xml文档并输出图书信息

这里写图片描述

1. 解析器Parser

首先解析XML文件之前要理解 解析器Parser是个什么东西

所谓 parser,一般是指把某种格式的文本(字符串)转换成某种数据结构的过程。最常见的> parser,是把程序文本转换成编译器内部的一种叫做“抽象语法树”(AST)的数据结构。我们用记事本写的xml只是文本文件,

简单说,文本文件使用parser解析后才是代码 好比1+2经过解析后编译器才知道这里有两个数1 ,2 然后相加了

所以解析一个xml文档要3个类DBF-DB 最后才得到Document

//newInstance声明 获得一个剖析器parserDocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();//DocumentBuilder得到一个文档剖析器实例DocumentBuilder db =dbf.newDocumentBuilder();//从XML得到一个文档Document document=db.parse("books.xml");

DocumentBuilderFactory官方定义

DocumentBuilderFactory官方定义
用于创建解析器

DocumentBuilder官方定义
DocumentBuilder官方定义
用于创建将XML转换为文档Document的文档解析器
因而先要从Factory里面创建一个解析器,再创建具体的文件解析器,再得到文档;

2.XML三种类型Node是什么和不同

<book name="属性">我是文本,会被识别为TextNode</book>

<></>这是一个ElementNode
id=”1”这一对键值对是Attribute Node
之间的纯文本会被识别为一个子节点 TextNode
他们对应的属性名和属性值
这里写图片描述

Document document=db.parse("books.xml");            //遍历循环获得所有的book Element            NodeList books=document.getElementsByTagName("book");            for (int i=0;i<books.getLength();i++) {                //强转 从Node类型转换为Element类型 每个book是一个Element                Element book=(Element) books.item(i);                //Element getNodeName有返回值(book) 没有Value;                String EleName=book.getNodeName();                //读取Element里的Attribute Node  可以用属性名来得到属性值                //也可以用getAttributes()得到所有属性给NamedNodeMap得到Attribute键值对                  //Name-属性名  Value-属性值                String attrValue=book.getAttribute("id");                System.out.println("Element属性名:"+EleName);                System.out.println("Attribute属性值:"+attrValue);                //ChildNode得到字节点                NodeList ChildNode=book.getChildNodes();                for(int k=0;k<ChildNode.getLength();k++){                    //中间有文本空白 会被识别为TextNode  属性名为#Text 属性值为文本内容                    //判断是ElementNode 输出属性名 当然还是没有属性值                     if(ChildNode.item(k).getNodeType()==Node.ELEMENT_NODE){                        //中间文本会被当做第一个子节点//                      System.out.println(ChildNode.item(k).getNodeName()+" "+ChildNode.item(k).getFirstChild().getNodeValue());                        //也可以直接读取Element间文本内容;                        System.out.println(ChildNode.item(k).getNodeName()+" "+ChildNode.item(k).getTextContent());                    }                }
原创粉丝点击