美文网首页程序员
JAVA使用DOM方式来解析XML文件

JAVA使用DOM方式来解析XML文件

作者: 承思 | 来源:发表于2017-11-22 20:33 被阅读0次

了解XML文件

xml表现:以.xml为文件扩展名的文件
xml文件的结构为树形结构
节点名区分大小写
在java程序中读取xml文件的过程称为解析xml文件
解析的目的:获取节点名、节点值、属性名、属性值。
通常使用四种解析方式:DOM、SAX、DOM4J、JDOM

解析xml文件的准备工作

1、创建一个DocumentBuilderFactory对象

DocumentBuilderFactory dbf=DocumentBuilderFactory.newinstance();

2、创建一个DocumentBuilder对象

DocumentBuilder db=dbf.newDoucumentBuilder();

3、通过DocumentBuilder对象的parse(String fileName)方法来解析xml文件

Document d=db.parse("url");//把XML文件加载到当前项目下

在java程序中如何获取xml文件的内容

通过上面的准备工作之后,我们把XML文件就加载到了项目中,然后我们可以通过Document.getElementsByTagName("TagName");方法来获取XML中节点的数据。这个方法会返回一个NodeList类型的值,直译过来就是一个节点集合。所以我们可以用NodeList来接受返回值

NodeList nl=Document.getElementsByTagName("TagName");

获取到了XML中的节点集合之后,可以通过getLength()方法来获取集合中的节点个数。同时可以用item(index);方法来获取集合当中的节点,这个方法会返回一个Node类型的值。

Node n=nl.item(index);

获取到了节点之后,我们可以通过getAttributes();方法来获取节点的属性值,它会返回一个NameNodeMap类型的集合,里面有节点所有的属性。

NamedNodeMap attrs=book.getAttributes();

然后通过item方法来获取attr中的属性,这个方法会返回一个Node类型的值,我们接收之后就可以通过调用 getNodeName以及getNodeValue两个方法来分别获取属性名以及属性值了。
除了获取节点的的属性之外,我们还可以获取节点的子节点。通过节点的getChildNodes函数,可以返回一个NodeList集合,里面有所有的子节点。需要注意的是子节点指的是节点中包含的所有数据,包括换行符。换行符会返回Test的值#test。在实际操作中,可以使用getNodeType函数来返回子节点的类型,从而来跳过换行符。

if(getNodeType()==Node.ELEMENT_NODE)

最后使用getNodeName函数可以获取到子节点的名字。如果还需要获得子节点的值,可以使用getTextContent函数,或者是使用getFirstChild先获取子节点的子节点,再使用getNodeValue函数来获取值。
完整的示例代码:

package com.DOM.test;

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.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DOMTest {
    public static void main(String[] args) throws IOException,SAXException,NullPointerException{
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder db=dbf.newDocumentBuilder();
            Document d=db.parse("books.xml");
            NodeList nl=d.getElementsByTagName("book");
            System.out.println("集合节点的个数:"+nl.getLength());
            for(int i=0;i<nl.getLength();i++){
                Node book=nl.item(i);
                NamedNodeMap attrs=book.getAttributes();
                System.out.println("节点属性的个数:"+attrs.getLength());
                for(int j=0;j<attrs.getLength();j++){
                    Node attr=attrs.item(j);
                    System.out.println("属性名:"+attr.getNodeName());
                    System.out.println("属性值:"+attr.getNodeValue());
                }
                NodeList chileList=book.getChildNodes();
                for(int k=0;k<chileList.getLength();k++){
                    if(chileList.item(k).getNodeType()==Node.ELEMENT_NODE){
                        System.out.println(chileList.item(k).getNodeName());
                        System.out.println(chileList.item(k).getFirstChild().getNodeValue());
                        System.out.println(chileList.item(k).getTextContent());
                    }
                    
                }
            }
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
}

用于测试的XML文件:

<?xml version="1.0" encoding="gb2312"?>
<bookstore>
    <book id="1,2" num="123">
        <name>冰与火之歌</name>
        <author>乔治马丁</author>
        <year>2014</year>
        <price>89</price>
    </book>
    <book id="2">
        <name>安徒生童话</name>
        <year>2004</year>
        <price>77</price>
        <language>English</language>
    </book>
</bookstore>

相关文章

网友评论

    本文标题:JAVA使用DOM方式来解析XML文件

    本文链接:https://www.haomeiwen.com/subject/ffinvxtx.html