xml文件--DOM方式解析xml

来源:互联网 发布:手机淘宝申请账号注册 编辑:程序博客网 时间:2024/05/21 18:32

知识简述

1.在Java程序中读取xml文件的过程也称为–解析xml文件
2.解析的目的:获取节点名、节点值、属性名、属性值
3.四种解析方式:DOM、SAX、DOM4J、JDOM前两种是官方提供的不必导jar包

要读取的xml文件

<?xml version="1.0" encoding="UTF-8"?><bookstore>    <book id="1">        <name>冰与活之歌</name>        <author>乔治马丁</author>        <year>2014</year>        <price>89</price>    </book>    <book id="2">        <name>安徒生童话</name>        <year>2014</year>        <price>77</price>        <language>English</language>    </book>    <book></book></bookstore>

java代码

package anqi.test;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;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;/* * 创建一个DocumentBuilderFactory的对象 * 创建一个DocumentBuilder的对象 * 通过DocumentBuilder对象的parse(String fileName)方法解析xml文件 * */public class DOMTest {    public static void main(String[] args)  {        //创建一个DocumentBuilderFactory的对象        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();        try{            //创建一个DocumentBuilder的对象            DocumentBuilder db = dbf.newDocumentBuilder();            //public Document parse(File f)            //public Document parse(String uri)            //通过DocumentBuilder对象的parse方法加载xml文件到当前项目下            Document document = db.parse("books.xml");            //获取所有book节点的集合            NodeList booklist = document.getElementsByTagName("book");            //遍历每一个book节点               for (int i =0; i < booklist.getLength(); i++){                System.out.println("------------下面开始遍历第"+(i+1)+"本书-------------");                //通过NodeList的item方法,获取一个节点                Node book = booklist.item(i);                //getAttributes()获取book节点下所有属性的集合                NamedNodeMap attrs = book.getAttributes();                //遍历book的每一个节点                for (int h = 0; h < attrs.getLength(); h++){                    //通过item方法获取某一个属性                    Node attr = attrs.item(h);                    //获取属性名                    System.out.print("属性名:"+attr.getNodeName()+"\t");                    //获取属性值                    System.out.println("属性值:"+attr.getNodeValue());                }                NodeList childNodes = book.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){                        //获取了element类型节点的节点名                        System.out.print("第"+(j+1)+"个节点的节点名:"+childNodes.item(j).getNodeName());                        //获取了element类型的节点值                    //  System.out.println("--节点值是"+childNodes.item(j).getFirstChild().getNodeValue());                    // 这两种方式都可以,但是如果该节点下还包含节点,第一种显示为null第二种把此节点和下一节点文字都输出                    //  System.out.println("--节点值是"+childNodes.item(j).getTextContent());                    }                }                /*                //前提:已经知道book节点有且只能有一个id属性,知道名字和个数                //将book及诶单进行强制类型转换,转换成Element类型                Element element = (Element) booklist.item(i);                //通过getAttribute("id")方法获取属性值                String value = element.getAttribute("id");                System.out.println("id的属性值是:"+value);                */                System.out.println("------------下面开始遍历第"+(i+1)+"本书-------------");            }        }catch(Exception e){}    }}

显示结果

------------下面开始遍历第1本书-------------属性名:id  属性值:1第1本书共有9子节点第2个节点的节点名:name--节点值是冰与活之歌第4个节点的节点名:author--节点值是乔治马丁第6个节点的节点名:year--节点值是2014第8个节点的节点名:price--节点值是89------------下面开始遍历第1本书-------------------------下面开始遍历第2本书-------------属性名:id  属性值:2第2本书共有9子节点第2个节点的节点名:name--节点值是安徒生童话第4个节点的节点名:year--节点值是2014第6个节点的节点名:price--节点值是77第8个节点的节点名:language--节点值是English------------下面开始遍历第2本书-------------------------下面开始遍历第3本书-------------第3本书共有0子节点------------下面开始遍历第3本书-------------

【注意事项】

1.如果xml文件改为这样

<name><a>aa</a>冰与活之歌</name>
System.out.println("--节点值是"+childNodes.item(j).getTextContent());
2个节点的节点名:name--节点值是aa冰与活之歌

System.out.println("--节点值是"+childNodes.item(j).getFirstChild().getNodeValue());
2个节点的节点名:name--节点值是null

2.DOM读取整个文档进内存,

childNodes.item(j).getNodeType() == Node.ELEMENT_NODE

这一句很关键,否则将会把回车也输出

原创粉丝点击