JavaWeb开发 XML技术详解(二)

简介: JavaWeb开发 XML技术详解(二)

6.3.2 Document对象详解

常用方法:

  • Element getElementById(String id):根据id获取元素
  • Elements getElementsByTag(String tagName):根据标签名获取元素
  • Elements getElementsByAttribute(String key):根据属性获取元素
  • Elements getElementsByAttributeValue(String key,String value):根据属性名=属性值获取元素。
  • Elements select(Sting cssQuery):根据选择器选取元素。
<!ELEMENT students (student*) >
        <!ELEMENT student (name,age,sex)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age (#PCDATA)>
        <!ELEMENT sex (#PCDATA)>
        <!ATTLIST student id ID #REQUIRED>
        <!ATTLIST name english>
<?xml version="1.0" ?>
        <!DOCTYPE students SYSTEM "student.dtd" >  <!--引入dtd约束文件-->
<students>
<student id="user1">
    <name english="zs">张三</name>
    <age>12</age>
    <sex>男</sex>
</student>
<student id="user2">
    <name english="ls">李四</name>
    <age>14</age>
    <sex>女</sex>
</student>
</students>
package com.it.Jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
/*Document对象使用*/
public class Jsoup3 {
    public static void main(String[] args) throws IOException {
        String path = Jsoup3.class.getClassLoader().getResource("com/it/XML/student.xml").getPath();
        Document document = Jsoup.parse(new File(path), "UTF-8");
        //1.根据id获取元素
        Element user1 = document.getElementById("user1");
        System.out.println(user1);
        System.out.println("--------------------------------");
        //2.根据标签获取元素
        Elements age = document.getElementsByTag("age");
        for (Element element : age) {
            System.out.println(element);
        }
        System.out.println("--------------------------------");
       //3.根据属性获取元素
        Elements english = document.getElementsByAttribute("english");
        for (Element element : english) {
            System.out.println(element);
        }
        System.out.println("--------------------------------");
        //4.根据属性名=属性值获取元素
        Elements elementsByAttributeValue = document.getElementsByAttributeValue("english", "ls");
        for (Element element : elementsByAttributeValue) {
            System.out.println(element);
        }
        System.out.println("--------------------------------");
        //5.使用css选择器获取元素
        Elements select = document.select("#user2");//根据id获取元素
        System.out.println(select);
        Elements sex = document.select("sex"); //根据标签获取元素
        for (Element element : sex) {
            System.out.println(element);
        }
    }
}

  控制台输出

<student id="user1"> 
 <name english="zs">
  张三
 </name> 
 <age>
  12
 </age> 
 <sex>
 </sex> 
</student>
--------------------------------
<age>
 12
</age>
<age>
 14
</age>
--------------------------------
<name english="zs">
 张三
</name>
<name english="ls">
 李四
</name>
--------------------------------
<name english="ls">
 李四
</name>
--------------------------------
<student id="user2"> 
 <name english="ls">
  李四
 </name> 
 <age>
  14
 </age> 
 <sex>
 </sex> 
</student>
<sex>
</sex>
<sex>
</sex>

6.3.3 Element对象详解

Element: 元素对象

常用方法:

  • String text():获取元素包含的纯文本。
  • String html():获取元素包含的带标签的文本。
  • String attr(String attributeKey):获取元素的属性值。
package com.it.Jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
public class Jsoup4 {
    public static void main(String[] args) throws IOException {
        String path = Jsoup4.class.getClassLoader().getResource("com/it/XML/student.xml").getPath();
        Document document = Jsoup.parse(new File(path), "UTF-8");
        //1.根据css获取元素
        Elements select = document.select("#user1");
        Element element = select.get(0); //获取第一个元素
        System.out.println("------------------------------------------------");
        System.out.println(element.text()); //第一个元素的纯文本
        System.out.println("------------------------------------------------");
        System.out.println(element.html()); //第一个元素的html
        System.out.println("-----------------------------------------------");
        System.out.println(element.attr("id")); //第一个元素的属性
    }
}
------------------------------------------------
张三 12 男
------------------------------------------------
<name english="zs">
 张三
</name> 
<age>
 12
</age> 
<sex>
</sex>
-----------------------------------------------
user1

6.4 Xpath解析

XPath即为XML路径语言,它是一种用来确定标记语言文档中某部分位置的语言。类似select选择器。

使用方法:

  1. 导入Xpath的jar包
  2. 获取Document对象
  3. Document对象转为JXDocument对象
  4. JXDocument调用selN(String xpath),获取List<JXNode>对象。
  5. 遍历List<JXNode>,调用JXNodegetElement(),转为Element对象。
  6. 处理Element对象。
package com.it.Jsoup;
import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class Xpath {
    public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        //2.获取Document对象
        String path = Xpath.class.getClassLoader().getResource("com/it/XML/student.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");
        //3.将Document转为JXDocument对象
        JXDocument jxDocument = new JXDocument(document);
        //4.JXDocument调用selN(String xpath),获取List<JXNode>对象。
        List<JXNode> jxNodes = jxDocument.selN("//name");//获取所有name标签
        List<JXNode> jxNodes1 = jxDocument.selN("//student[@id=user1]/age");//获取属性是id=user1的student标签的子元素age
        //5.遍历List<JXNode>,调用JXNode的getElement(),转为Element对象。
        for (JXNode jxNode : jxNodes) {
            //6.处理Element对象.
            Element element = jxNode.getElement();
            System.out.println(element);
        }
        System.out.println("--------------------------------");
        for (JXNode jxNode : jxNodes1) {
            Element element = jxNode.getElement();
            System.out.println(element);
        }
    }
}
<name english="zs">
 张三
</name>
<name english="ls">
 李四
</name>
--------------------------------
<age>
 12
</age>

七、XML案例 网络爬虫

网络爬虫(web crawler):自动抓取互联网信息的程序。

比如我们要开发一个网站,在网页的右上角需要显示今日天气,如果人工查询天气预报维护非常繁琐,我们就可以使用爬虫程序自动爬取天气网站的程序,自动更新。

Jsoup可以通过URL获取网页的HTML源文件,源文件中包含着网站数据,我们可以解析HTML源文件的数据来获取我们需要的信息。

爬虫步骤:

  1. 引入jar包。
  2. 使用Jsoup获取网页HTML源文件,转为Document对象
  3. 通过Document对象,获取需要的Element对象
  4. 获取Element对象的数据。
  5. 设置循环自动爬取

爬取知乎日报的数据

<?xml version="1.0"?>
<Crawler>
    <min>9734020</min>
    <max>9734346</max>
</Crawler>
package com.it.Jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class Crawler {
    public static void getInfo(int i) throws IOException {
        //2.使用Jsoup获取网页HTML源文件,转为Document对象
        Document document = Jsoup.parse(new URL("http://daily.zhihu.com/story/"+i), 3000);
        //3.通过Document对象,获取需要的Element对象
        //根据属性获取图片
        Elements pic = document.getElementsByAttributeValue("alt", "头图");
        //获取文章标题
        Elements title = document.select(".DailyHeader-title");
        //获取文章作者
        Elements author = document.select(".author");
        //获取文章正文
        Elements content = document.select(".content");
        //4.获取Element对象的数据。
        String src = pic.get(0).attr("src");
        System.out.println(src);
        String text = title.get(0).text();
        System.out.println(text);
        String au = author.get(0).text();
        System.out.println(au);
        String con = content.get(0).text();
        System.out.println(con);
        System.out.println("--------------------------------");
    }
    public static void main(String[] args) throws IOException {
        //5.读取配置文件设置循环自动爬取
        String path = Crawler.class.getClassLoader().getResource("com/it/Jsoup/Crawler.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");
        Elements min = document.getElementsByTag("min");
        Elements max = document.getElementsByTag("max");
        for (int i = Integer.parseInt(min.get(0).text()); i <= Integer.parseInt(max.get(0).text());i++){
            try {
                getInfo(i);
            } catch (Exception e) {
                System.out.println("爬取失败:"+e.getMessage());
            }
        }
    }
}

相关文章
|
7天前
|
XML JavaScript 数据格式
XML 相关技术
XML 相关技术
|
3月前
|
XML JavaScript Java
【JAVA XML 探秘】DOM、SAX、StAX:揭秘 Java 中 XML 解析技术的终极指南!
【8月更文挑战第25天】本文详细探讨了Java中三种主流的XML解析技术:DOM、SAX与StAX。DOM将XML文档转换为树状结构,便于全方位访问和修改;SAX采取事件驱动模式,适用于大型文件的顺序处理;StAX则兼具DOM和SAX的优点,支持流式处理和随机访问。文中提供了每种技术的示例代码,帮助读者理解如何在实际项目中应用这些解析方法。
159 1
|
5月前
|
XML Java 数据格式
必知的技术知识:java基础73dom4j修改xml里面的内容(网页知识)
必知的技术知识:java基础73dom4j修改xml里面的内容(网页知识)
39 1
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
79 0
|
3月前
|
XML Android开发 UED
"掌握安卓开发新境界:深度解析AndroidManifest.xml中的Intent-filter配置,让你的App轻松响应scheme_url,开启无限交互可能!"
【8月更文挑战第2天】在安卓开发中,scheme_url 通过在`AndroidManifest.xml`中配置`Intent-filter`,使应用能响应特定URL启动或执行操作。基本配置下,应用可通过定义特定URL模式的`Intent-filter`响应相应链接。
110 12
|
3月前
|
C# 前端开发 UED
WPF数据验证实战:内置控件与自定义规则,带你玩转前端数据验证,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,数据验证是确保输入正确性的关键环节。前端验证能及时发现错误,提升用户体验和程序可靠性。本文对比了几种常用的WPF数据验证方法,并通过示例展示了如何使用内置验证控件(如`TextBox`)及自定义验证规则实现有效验证。内置控件结合`Validation`类可快速实现简单验证;自定义规则则提供了更灵活的复杂逻辑支持。希望本文能帮助开发者更好地进行WPF数据验证。
108 0
|
5月前
|
SQL XML 数据库
后端数据库开发高级之通过在xml文件中映射实现动态SQL
后端数据库开发高级之通过在xml文件中映射实现动态SQL
51 3
|
5月前
|
XML Java 数据库连接
技术笔记:Maven的pom.xml(坐标的gav、依赖的scope)
技术笔记:Maven的pom.xml(坐标的gav、依赖的scope)
172 0
|
5月前
|
XML 数据格式
程序技术好文:格式化xml
程序技术好文:格式化xml
89 0
|
1月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
57 1