• XML.04-dom4j和XPath


     

    • 下载对应的jar包,导入到对应的工程中
    • 对于对于的web项目,复制dom4j-1.6.1.jar到 WebRoot – WEB-INF – lib里面
    • 对于java项目:新建source folder–>复制jar包–>右键–>build path–>add to build path

    dom4j的基本使用

    基本的解析

    1.    public Document parseDoc(String filePath) throws DocumentException {
    2. return new SAXReader().read(filePath);
    3. }

    读取一个元素

    1.    public void getElement() throws DocumentException{
    2.
    3. Document document = parseDoc(path);
    4. Element root = document.getRootElement();
    5. List<Element> books = root.elements("书");
    6. Element book2 = books.get(1);
    7. Element author2 = book2.element("作者");
    8. System.out.println(author2.getText());
    9.
    10. }

    在元素末尾添加子元素

    1.    public void addElement() throws Exception{
    2. Document document= parseDoc(path);
    3. Element root = document.getRootElement();
    4. Element book2 = (Element)root.elements("书").get(1);
    5. book2.addElement("cat").setText("I am a cat");
    6. writeBack(document, path);
    7. }

    在任意位置添加子元素

    1.    public void insertElement() throws Exception{
    2. Document document = parseDoc(path);
    3. Element root = document.getRootElement();
    4. Element book2 = (Element)root.elements("书").get(1);
    5. List<Element> list = book2.elements();
    6. Element cat = DocumentHelper.createElement("cat2");
    7. cat.setText("I am a cat too");
    8. list.add(1, cat);
    9. writeBack(document, path);
    10. }

    在任意位置添加,这回真的是任意位置了…dom4j并没有提供insertBefore这种方法,但是我们通过elements()方法拿到的一个list真的是个list…所以可以直接add进去.

    删除一个元素

    1.    public void removeElement() throws Exception{
    2. Document document = parseDoc(path);
    3. Element root = document.getRootElement();
    4. Element book2 = (Element)root.elements("书").get(1);
    5. //Element cat = root.element("cat2");
    6. Element cat = book2.element("cat2");
    7. book2.remove(cat);
    8. writeBack(document, path);
    9.
    10. }

    elements()方法,只是查找当前元素的下一级的子元素,注意注释那一行,刚开始写错了,而且神奇的是这玩意儿没找到也不报错…

    修改一个元素

    1.public void changeElement() throws Exception{
    2. Document document = parseDoc(path);
    3. Element root = document.getRootElement();
    4. Element book2 = (Element)root.elements("书").get(1);
    5. Element author2 = book2.element("作者");
    6.
    7. author2.setText("西川结衣");
    8. writeBack(document, path);
    9. }

    回写

    1.    public void writeBack(Document document,String filePath) throws Exception{
    2. OutputFormat format = OutputFormat.createPrettyPrint();
    3. format.setEncoding("UTF-8");
    4. XMLWriter writer = new XMLWriter(new FileOutputStream(filePath), format);
    5. writer.write(document);
    6. writer.close();
    7. }

    XPath

    啥是XPath

    XPATH是在XML中查找信息的一种语言,通过它可以很方便快捷精确的找到一个元素.

    • 使用路径表达式在XML文档中导航
    • 包含一个标准函数库
    • 是W3C的标准
    • 是XSLT的主要元素(这是什么玩意儿,实在不想查了)

    XPath语法

    XPath中有七种节点: 元素,属性,文本,命名空间,处理指令,注释以及文档(根节点)

    XML文档是被当作一个树对待的,文档节点也就是所谓的根节点. 其他的叫法都遵循树的原则.

    路径表达式

    表达式 描述
    nodeName 选取此节点的所有子节点
    / 从根节点开始匹配
    // 从匹配选择的当前节点选择,不考虑位置
    . 当前节点
    .. 当前节点的父节点
    @ 属性

    比如

    • bookstore 选取bookstore元素所有的子节点
    • /bookestore 选取根元素bookstore
    • bookst/book 选取属于bookstore的子元素的所有book元素
    • //book 选取所有book子元素,不管在什么位置
    • bookstore//book 选取属于bookstore的后代的所有book元素. 不管它位于bookstore下的什么位置
    • //@lang 选取名为lang的所有属性
    • /AAA/BBB 从根节点开始获取BBB元素
    • //BBB 忽略层级关系,获取所有BBB元素
    • //BBB/DDD 找所有BBB下的DDD元素

    谓语

    用来查找特定条件的节点,写在方括号里

    比如:

    • /bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
    • /bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
    • /bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
    • /bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
    • //title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
    • //title[@lang=’eng’] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
    • /bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
    • /bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
    • /AAA/BBB[1] 找AAA下的第一个BBB
    • /AAA/BBB[last()] 最后一个

    通配符

    • /AAA/BBB/CCC/* 考虑层级关系找/AAA/BBB/CCC/下的所有元素
    • //* XML中的所有元素
    • //@id 选择所有

    选取若干路径

    可以使用| 来选取若干路径,比如

    • //book/title | //book/price

    再复杂的就去看W3school吧…

    Dom4j对XPATH的支持

    dom4j是支持XPath的,需要导入jaxen包

    仅可以使用的两个方法:

    • selectNodes()
    • selectSingleNode()

    不多做解释.


  • 相关阅读:
    网络爬虫基础练习
    Hadoop综合大作业
    hive基本操作与应用
    用mapreduce 处理气象数据集
    熟悉常用的HBase操作
    爬虫大作业
    第三章 熟悉常用的HDFS操作
    数据结构化与保存
    获取全部校园新闻
    爬取校园新闻首页的新闻
  • 原文地址:https://www.cnblogs.com/thecatcher/p/6220707.html
Copyright © 2020-2023  润新知