Java-xml解析

xml文件结构

声明版本与字符集

<bookstore>
    <book id="1">
        <name>冰与火之歌</name>
    </book>
</bookstore>

建立根节点–>建立子节点–>建立子节点属性

xml解析的种类

Java程序中读取xml文件的过程也称为解析xml文件,解析的目的:获取节点名、节点值、属性名、属性值
4种解析方式:
1)DOM解析 2)SAX解析 —->Java官方提供的xml文件解析方式
3)DOM4J解析 4)JDOM解析 —->其他组织编写的解析xml文件的jar包,实际开发中,需要导入相应的jar包

DOM方法解析

解析流程

使用DOM解析XML

  1. 创建DocumentBuilderFactory对象和DocumentBuilder对象
  2. 通过DocumentBuilder对象的parse方法加载XML文件
  3. 通过getElementsByTagName方法获取节点存入list集合中
  4. 通过item方法获取集合中的节点,通过getAttributes()方法将节点的属性存入map集合中
  5. 通过getChildNodes()获取节点中的子节点存入list集合中

节点类型


book节点有属性节点和子节点,属性节点是id=1。子节点又分为element节点和text节点,element节点是用标签包含的内容,text节点是没有用标签标记的文本(包括空行)。

<bookstore>
    <book id="1">
        <name>冰与火之歌</name>
    </book>
</bookstore>

节点描述如图:
节点示意图

类似的,DOM方法解析HTML也有对应的节点树
这里写图片描述

测试代码

public class DOMDemo {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document document = docBuilder.parse(new File("demo\\books.xml"));
        //获取所有book节点的集合
        //document.getElementsByTagName("book"); 通过标签名获取Node列表
        NodeList bookList = document.getElementsByTagName("book");
        for(int i=0;i<bookList.getLength();i++){
            Node book = bookList.item(i);
            NamedNodeMap attr = book.getAttributes();
            System.out.println("第"+i+"本书的属性值是"+attr.item(0).getNodeName()+"="+attr.item(0).getNodeValue());
            NodeList bookAtrr = book.getChildNodes();
            //System.out.println(bookAtrr.item(0).getNodeName()+"="+bookAtrr.item(0).getNodeValue());
            //此时输出#text=(换行),因为空行被看做一个text节点,值为换行符
            for(int j=0;j<bookAtrr.getLength();j++){
                if(bookAtrr.item(j).getNodeType()==Node.ELEMENT_NODE){
                    //bookAtrr.item(j).getFirstChild().getNodeValue()
                    //标签中的值其实是一个text节点
                    System.out.println(bookAtrr.item(j).getNodeName()+"="+bookAtrr.item(j).getFirstChild().getNodeValue());
                }
            }
            System.out.println();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值