XML解析之dom4j

使用dom4j解析xml

  • dom4j是一个组织,针对xml解析,提供了解析器dom4j
  • 导入dom4j的jar包
    • 创建一个文件夹lib
    • 把jar包复制到lib下
    • 右键点击jar包,选择添加到path
    • 看到jar包变成奶瓶的形状就可以了
  • 常用的类:

    • SAXReader类
      • 使用这个 类创建一个解析器
      • new SAXReader()
        • Document read(String systemId) 使用这个方法,创建document对象
    • Document类
      • Element getRootElement() 使用这个方法获得根节点,返回值是一个Element对象
    • Element类
      • List elements() 方法获得所有的 子元素的集合
    • 实例:查询根节点的所有的 子节点,打印出名称

      
          import java.util.List;
      
          import org.dom4j.Document;
          import org.dom4j.Element;
          import org.dom4j.io.SAXReader;
      
          public class Demo_dom4j {
              public static void main(String[] args) throws Exception {
          //      创建一个解析器
                  SAXReader reader = new SAXReader();
          //      获得document对象
                  Document read = reader.read("src\\haha.xml");
          //      获得根节点
                  Element rootElement = read.getRootElement();
          //      获得根节点 下一层的所有元素,只能遍历一层
                  List<Element> elements = rootElement.elements();
          //      遍历字元素
                  for (Element element : elements) {
                      String name = element.getName();
                      System.out.println(name);
      
                  }
      
              }
          }
      
  • 实例:在指定的元素下添加一个元素,

    • 回写操作这里写图片描述
  • 实例:修改文本中的一个元素的内容

    • 创建解析器
    • 获得dom对象
    • 找到要操作的节点
    • 修改内容
    • 回写
      这里写图片描述
  • 实例:删除指定的节点
    • 创建解析器
    • 获得dom对象
    • 找到要删除的节点
    • 找到他的父节点
    • 使用remove方法删除
    • 回写操作,写入文件
    • 这里写图片描述
  • 实例:获取属性值
    • 创建解析器
    • 获得dom对象
    • 找到要操作的节点
    • String attributeValue(String name)使用这个方法获得属性值,返回值是一个字符串类型的
    • 这里写图片描述

使用dom4j支持的xpth操作

  • 可以直接获取到某个元素
  • 第一种形式/AAA/BBB/CCC 一层一层往下找
  • 低二种形式//BBB 表示质押 和这个名称相同的 都找到
  • 第三种形式/* 表示所有元素
  • 第四种形式
    • //BBB[1]表示第一个BBB元素4
    • //BBB[last()]表示最后一个BBB元素
  • 第五种形式
    • //BBB[@id]表示找到有id属性的BBB元素
      -第六种形式
    • //BBB[@id=’bi’]表示找到有属性id属性值是bi的BBB元素

使用dom4j支持xpth具体操作

  • 导入jar包,只是dom4j中的lib文件夹 内是包含 这个jar包的,但是一定要注意导入
  • 在默认情况下dom4j不支持xpath
  • 要想使用xpth首先需要引入jar包
  • dom4j提供了两个方法用来 支持xpth
    • selectNodes(String xpathExpression)获取多个节点
    • selectSingleNode(String xpathExpression)获取一个节点
  • 实例:使用xpth找出所有的name元素,打印出来这里写图片描述
  • 实例:使用dom4j支持的xpth,找到指定的元素
    这里写图片描述

dom4j解析xml 使用sax方式

  • 先要创建一个SAX解析工厂,
  • 使用解析工厂创建一个解析器
  • 使用解析器对象,获得一个读取器对象
  • 给读取器设置一个处理器,参数是ContentHandler的一个实现类对象
  • 执行parse 解析方法

==注意==
- 由于SAX方式,是一行一行的解析的 ,所以这种方式解析,系统会自动执行处理器内的 方法,不需要我们调用

  • 实例:使用SAX方式,解析出来,所有的学生,并且进行封装
/**
     * 使用dom4j的sax方式解析xml
     * @author lien
     * @throws SAXException 
     * @throws ParserConfigurationException 
     * @throws IOException 
     * 
     * */
    @Test
    public void test2() throws ParserConfigurationException, SAXException, IOException{


//      创建解析器工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
//      使用工厂产生解析器
        SAXParser parser = factory.newSAXParser();
//      使用解析器对象,得到一个读取器对象
        XMLReader reader = parser.getXMLReader();




//      给读取器,设置个处理器
        reader.setContentHandler(new ContentHandler() {

            @Override
            public void startPrefixMapping(String prefix, String uri)
                    throws SAXException {
//              System.out.println("startPrefixMapping方法打印---" + prefix + uri);

            }

            @Override
            public void startElement(String uri, String localName, String qName,
                    Attributes atts) throws SAXException {

                nodeName = qName;//会将读取到每个节点的名字临时保存下来
                if("student".equals(qName)){
                    p = new Person();//如果找到studnet节点那么开始读取内容,记性封装
                }
                System.out.println("startElement 方法打印---"+uri + localName + qName);

            }

            @Override
            public void startDocument() throws SAXException {
//              System.out.println("startDocument方法打印");

            }

            @Override
            public void skippedEntity(String name) throws SAXException {
//              System.out.println("skippedEntity方法打印" + name);

            }

            @Override
            public void setDocumentLocator(Locator locator) {
//              System.out.println("setDocumentLocator方法打印" + locator);

            }

            @Override
            public void processingInstruction(String target, String data)
                    throws SAXException {
//              System.out.println("processingInstruction方法打印---" + target + data);

            }



            @Override
            public void endPrefixMapping(String prefix) throws SAXException {
//              System.out.println("endPrefixMapping方法打印---"+prefix);

            }

            @Override
            public void endElement(String uri, String localName, String qName)
                    throws SAXException {
                if("student".equals(qName)){
                    nodeName = null;//如果结束标签读取到保存的节点,那么临时空间清空
//                  同时将等装好的对象,加入到集合中
                    arrPerson.add(p);
                }

                System.out.println("endElement方法打印---"+uri + localName + qName);

            }

            @Override
            public void endDocument() throws SAXException {
//              System.out.println("endDocument()方法打印");

            }

            @Override
            public void characters(char[] ch, int start, int length)
                    throws SAXException {
                if("name".equals(nodeName)&&p.getName() == null){
                    p.setName(new String(ch,start,length));
                }
                if("age".equals(nodeName)&&p.getAge() == null){
                    p.setAge(new String(ch,start,length));
                    System.out.println("characters方法打印"+new String(ch,start,length));
                }
                if("sex".equals(nodeName) && p.getSex() == null){
                    p.setSex(new String(ch,start,length));
                    System.out.println("characters方法打印"+new String(ch,start,length));
                }

            }

            @Override
            public void ignorableWhitespace(char[] ch, int start, int length)
                    throws SAXException {
//              System.out.println("ignorableWhitespqce方法打印--"+new String(ch,start,length));

            }
        });

        reader.parse("a.xml");

//      打印集合
        System.out.println(arrPerson);
    }
  • 结果:

[Person [name=张星星, age=18, sex=男], Person [name=杨杰, age=18, sex=男], Person [name=张星星, age=18, sex=男], Person [name=陈鹏鹏, age=18, sex=男], Person [name=小明, age=12, sex=男], Person [name=小明, age=12, sex=男], Person [name=小明, age=12, sex=男]]
“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值