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());
            }
        }
    }
}

相关文章
|
3月前
|
XML 数据处理 数据格式
什么是 SAP UI5 XML Templating 技术
什么是 SAP UI5 XML Templating 技术
44 0
|
7月前
|
XML Java 数据格式
10Spring - 基于AspectJ的AOP开发 (XML的方式)
10Spring - 基于AspectJ的AOP开发 (XML的方式)
24 0
|
8天前
|
XML Java 数据库连接
Javaweb之Mybatis的XML配置文件的详细解析
Javaweb之Mybatis的XML配置文件的详细解析
13 0
|
27天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
2月前
javaWeb服务详解(含源代码,测试通过,注释) ——web.xml
javaWeb服务详解(含源代码,测试通过,注释) ——web.xml
7 0
|
2月前
javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext.xml
javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext.xml
6 0
|
2月前
|
XML 存储 JavaScript
深入学习 XML 解析器及 DOM 操作技术
所有主要的浏览器都内置了一个XML解析器,用于访问和操作XML XML 解析器 在访问XML文档之前,必须将其加载到XML DOM对象中 所有现代浏览器都有一个内置的XML解析器,可以将文本转换为XML DOM对象
72 0
|
2月前
|
XML 安全 API
Python读写XML文件:深入解析与技术实现
Python读写XML文件:深入解析与技术实现
55 0
|
4月前
|
XML Java 数据格式
javaweb实训第五天下午——xml配置文件约束报错问题
问题描述: 如果电脑连不上网,或者网速不好可能会造成Spring框架中xml配置文件出现错误。但是这个错误不影响项目的运行的;
20 0
|
5月前
|
Java 应用服务中间件 Spring
WebService - Axis2使用services.xml进行开发server与client(未与Spring整合)
WebService - Axis2使用services.xml进行开发server与client(未与Spring整合)
47 0