XML介绍:

XML简介:

  • XML,可扩展标记语言,标准通用标记语言的子集。
  • 一种用于标记电子文件使其具有结构性的标记语言。
  • 它可以用来标记数据、定义数据类型
  • 是一种允许用户对自己的标记语言进行定义的源语言。
  • 非常适合万维网传输
  • 提供统一方法描述和交换独立于应用程序或供应商的结构化数据

XML的特点:

  • XML是一种标记语言,很类似HTML
  • XML的设计宗旨是传输数据,而非显示数据
  • XML标签没有被预定义,需要自行定义标签
  • XML被设计为具有自我描述性
  • XML是W3C的推荐标准

    XML与HTML对比:

    1. XML和HTML是为不同目的而设计:
  • XML被设计为传输和存储数据,其焦点是数据的内容

  • HTML被设计用来显示数据,其焦点是数据的外观
  • HTML旨在显示数据,而XML旨在传输数据

2.XML仅仅是纯文本
有能力处理纯文本的软件都可以处理XML。不过能够读懂XML的应用程序可以有针对的处理XML的标签。标签的功能性意义依赖于应用程序的特性。

3.XML没有预定义的标签
在HTML中使用的标签(以及HTML的结构)是预定义的。HTML文档只使用在HTML标准中定义过的标签。

XML的语法规则:

  1. 在XML中,省略关闭标签是非法的,所有标签都必须有关闭标签。
  2. XML标签对对大小写敏感
  3. XML必须正确的嵌套
  4. XML文档必须有根元素
  5. XML的属性值必须加引号
  6. XML中,空格会被保留

元素可以包含其他元素、文本、或者两者的混合物。元素也可以拥有属性。

<bookstore><book category="children"><title>Harry Potter</title><author>JK.Rowing</author><year>2005</year><price>29.9</price></book>
</bookstore>
<bookstore>和<book>都拥有元素内容,因为他们包含了其他元素。
<author>只有文本内容,因为仅包含文本。
在上例中,只有<book>元素属性(category="children")

使用JDK自带的API(Document)解析和生成XML文件:
需要解析的XML文件:

<?xml version="1.0" encoding="utf-8"?><languages cat="it"><lan id="1"><name>Java</name><ide>Eclipse</ide></lan><lan id="2"><name>Swift</name><ide>XCode</ide></lan><lan id="3"><name>C#</name><ide>Visual Studio</ide></lan></languages>
package com.example.myxmltest;import java.io.InputStream;
import java.io.StringWriter;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;public class MainActivity extends Activity {private TextView text;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();dealXML();//解析XML文件//        createXML();//创建XML文件}/*** 创建XML文件*/private void createXML() {try {DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = builderFactory.newDocumentBuilder();Document document = builder.newDocument();//创建根节点元素Element root = document.createElement("Languages");//为根节点元素设置属性值root.setAttribute("cat", "it");//第一个子节点//创建子节点元素,并为子节点元素设置属性值Element lan1 = document.createElement("lan");lan1.setAttribute("id", "1");//创建子节点的子节点元素,并为其设置内容属性值Element name1 = document.createElement("name");name1.setTextContent("Java");Element ide1 = document.createElement("ide");ide1.setTextContent("Eclipse");//将这些内容节点添加到子节点中作为子节点的子节点lan1.appendChild(name1);lan1.appendChild(ide1);//第二个子节点//创建子节点元素,并为子节点元素设置属性值Element lan2 = document.createElement("lan");lan2.setAttribute("id", "2");//创建子节点的子节点元素,并为其设置内容属性值Element name2 = document.createElement("name");name2.setTextContent("Swift");Element ide2 = document.createElement("ide");ide2.setTextContent("XCode");//将这些内容节点添加到子节点中作为子节点的子节点lan2.appendChild(name2);lan2.appendChild(ide2);//第三个子节点//创建子节点元素,并为子节点元素设置属性值Element lan3 = document.createElement("lan");lan3.setAttribute("id", "3");//创建子节点的子节点元素,并为其设置内容属性值Element name3 = document.createElement("name");name3.setTextContent("C#");Element ide3 = document.createElement("ide");ide3.setTextContent("Visual studio");//将这些内容节点添加到子节点中作为子节点的子节点lan3.appendChild(name3);lan3.appendChild(ide3);//将子节点添加到根节点中作为根节点的子节点root.appendChild(lan1);root.appendChild(lan2);root.appendChild(lan3);//添加根节点元素document.appendChild(root);TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();transformer.setOutputProperty("encoding", "utf-8");StringWriter sw = new StringWriter();transformer.transform(new DOMSource(document), new StreamResult(sw));text.setText(sw.toString());} catch (Exception e) {e.printStackTrace();}}/*** 用JDK自带的API(Document)解析XML文件*/private void dealXML() {try {DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = builderFactory.newDocumentBuilder();InputStream inputStream = getAssets().open("languages.xml");Document document = builder.parse(inputStream);//当前的element代表根节点中所有内容Element element = document.getDocumentElement();NodeList nodeList = element.getElementsByTagName("lan");for (int i = 0; i < nodeList.getLength(); i++) {Element lan = (Element) nodeList.item(i);text.append(lan.getAttribute("id")+"\n");text.append(lan.getElementsByTagName("name").item(0).getTextContent()+"\n");text.append(lan.getElementsByTagName("ide").item(0).getTextContent()+"\n");}} catch (Exception e) {e.printStackTrace();}}private void initView() {text = (TextView) findViewById(R.id.text);}
}

HTML、XML等Dom节点类解析库的使用:

Jsoup简介:
jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。

Jsoup特点:

  • HTML、XML、自定义DOM格式文本解析
  • 可操作HTML元素、属性、文本
  • 适用于采集解析网站HTML
  • DOM解析功能非常强大

Jsoup基本用法:

  1. 分析Html或Dom文本的结点标签结构
  2. 寻找你要解析的那个内容部分所在的结点标记
  3. 调用Jsoup API解析结点内容

代码演示:

  1. 使用Jsoup载入Html数据
  2. 使用Jsoup解析并提取HTML元素
  3. 使用Jsoup修改数据
  4. 使用Jsoup HTML文档清理
package com.test.Jsoup;import java.io.File;
import java.io.IOException;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.safety.Whitelist;
import org.jsoup.select.Elements;import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;import com.example.myxmltest.R;/*** Jsoup的四个功能的基本使用方法* @author Administrator**/
public class JsoupTest extends Activity {private String html = "<html><head><title>Jsoup的用法</title></head><body><p><a href='http://baidu.com'>这里是Jsoup项目的相关文章</a></p></body></html>";private String url = "http://baidu.com";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/** 1.使用 Jsoup 载入 Html 数据功能* 数据内容可以是:html文本、url、本地html*///1.html文本Document doc = Jsoup.parse(html);//可以获取到html中<title>的值doc.title();//2.urltry {//通过GET方式请求Document doc2 = Jsoup.connect(url).get();//通过POST方法请求
//          Document doc2 = Jsoup.connect(url).data("key","value").timeout(3000).post();} catch (IOException e) {e.printStackTrace();}//3.本地html//获取本地html文件File file = new File(Environment.getExternalStorageDirectory()+"/index.html");//parse()方法参数解释:1.html文件  2.html的编码格式(本地html文件是什么编码就写什么编码)  3.当本地html文件中的图片或者链接采用的是相对路径时,就可以通过指定的baseUri替换路径的前缀。eg:.../baidu.png-->http://baidu.com/baidu.pngtry {Document doc3 = Jsoup.parse(file, "utf-8", "http://baidu.com");} catch (IOException e) {e.printStackTrace();}/** 2.使用 Jsoup 解析并提取 HTML元素功能*/Elements eles = doc.getElementsByTag("a");//将a标签的列表存储成元素集合for (Element link : eles) {//获取a标签中href的属性值String linkHref = link.attr("href");//获取a标签中的文本值String text = link.text();}//检索元素功能//检索html文件中的a标签并且就有href属性的a标签列表存储成元素集合Elements elements = doc.select("a[href]");//检索html文件中有img标签的.png格式的图片Elements elements2 = doc.select("img[src$=.png]");//检索出元素名为className的div标签的元素Element element3 = doc.select("div.className").first();/** 3.使用 Jsoup 修改数据属性功能*///对元素名为className的div标签添加属性,属性名为key,属性值为valuedoc.select("div.className").attr("key","value");//为元素名为className的div标签添加属性类,添加的属性为:class="myclass"doc.select("div.className").addClass("myclass");//移除img标签的onClick属性doc.select("img").removeAttr("onClick");/** 4.使用 Jsoup HTML 文档清理功能*/String htmls = "";//不安全的一个html代码String safe = Jsoup.clean(htmls, Whitelist.basic());//用基本的白名单将不安全的html代码转换为安全的html}
}

使用Jsoup来实现复杂的Html列表解析:

实现效果:
使用 Jsoup 实现对某网站新闻列表的采集解析

package com.test.jsoupdemo;import java.io.IOException;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import com.example.myxmltest.R;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;/*** 使用Jsoup解析HtmL新闻列表*/
public class JsoupDemo extends Activity {private String url = "http://mobile.csdn.net/";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {@Overridepublic void run() {parseHtml();}}).start();;}//使用Jsoup解析html新闻列表private void parseHtml() {try {Document doc = Jsoup.connect(url).get();//将所有的新闻列表存储为元素的集合Elements elements = doc.select("div.unit");for (Element element : elements) {//获取每一条新闻的标题<h1>标签中的文本内容,因为每条新闻中只有一个h1,所以可以通过getElementsByTag("h1")获取到String title = element.getElementsByTag("h1").first().text();//获取每条新闻标题中的<h1>标签中的超链接String href = element.getElementsByTag("h1").first().getElementsByTag("a").first().attr("href");//获取每条新闻的新闻内容<dd>标签中的文本内容
//              String content = element.getElementsByTag("dd").first().text();Log.i("tag", title);Log.i("tag", href);
//              Log.i("tag", content);}} catch (IOException e) {e.printStackTrace();}}}

原网页截图:

对应的网页源代码截图:

根据上图可以看出每条新闻的相同点:每条新闻的内容都是在<div class="unit">标签中。


通过上图可以发现每条新闻中只有一个<h1>标签。

运行结果截图:

Andorid中使用Jsoup解析库解析XML、HTML、Dom节点---第三方库学习笔记(三)相关推荐

  1. Dom4j 解析Xml文档及 XPath查询 学习笔记

    2019独角兽企业重金招聘Python工程师标准>>> 本文查阅方法:     1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题     2.快捷"查找" ...

  2. C/C++ 开发 boost 库参考手册整理(2) 【学习笔记】

    文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正.并且该文档在后期会随着学习的深入不断补充完善.感谢各位的参考查看. 笔记资料仅供学习交流使用,转载请标明出处 ...

  3. java学习笔记(三):前端miniUI控件库入门

    java学习笔记(三):前端miniUI控件库入门 最近在一家公司实习学习,一上来就需要学习了解相关的前端内容--miniUI.而这个内容自己本身并没有了解学习过,上手也是遇到了不少的问题,于是想把自 ...

  4. python第三方库使用文档_python 的第三方库的使用

    我们写python代码的时候往往需要用第三方的库文件,Python强大的原因就是有大量的功能各异的第三方库.因此学会如何使用第三方库很有必要. 除了python官方自带的模块外,大部分第三方库是需要先 ...

  5. python第三方库文件传输_慢步学习,python库文件概述,再来点第三方库文件安装的干货...

    python是一个开源项目 我们知道Python一个开源的程序设计语言.但确切的说法应该是,Python是一个开源的编程项目,而这个项目由全球开发者共同开发. 就像数学一样,全球开源,有共同的规则,有 ...

  6. Andorid中使用Gson和Fast-json解析库解析JSON数据---第三方库学习笔记(二)

    JSON介绍: JSON:JavaScript对象表示法 JSON是存储和交换文本信息的语法. 特点: JSON是轻量级的文本数据交换格式 JSON独立于语言和平台 JSON具有自我描述性,更易理解 ...

  7. Dom4j 解析Xml文档及XPath查询 学习笔记

    本文查阅方法:     1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题     2.快捷"查找" -- 在当前浏览器页面,按键 "Ctrl+F" 按键 ...

  8. python解析pdf中文乱码_使用Python第三方库pdfminer提取PDF内容,并解决中文编码不支持的问题...

    这两天刚好完成一个提取人行简版征信报告PDF所有数据的小项目,中间踩了很多坑,尤其是对于汉字编码问题度娘也不太灵.为了方便后人,在这里记录下在这个过程中我遇到的问题以及我的解决方法. 我用的是mac系 ...

  9. python第三方库排行-Python模块汇总(常用第三方库)

    模块 定义 计算机在开发过程中,代码越写越多,也就越难以维护,所以为了编写可维护的代码,我们会把函数进行分组,放在不同的文件里.在python里,一个.py文件就是一个模块 优点: 提高代码的可维护性 ...

最新文章

  1. 一家成立于100多年前于剑桥的科技创新公司和对我们现在的启示
  2. python开发范围_Python上的字母范围
  3. javascript基本排序算法
  4. vivo android 6.0 root,vivo X6 A(全网通)如何获取ROOT权限教程
  5. ascii码值为负数_C语言字符型数据的ASCII码值为何是负数?
  6. python 字母查找
  7. BPM平台应用价值(下篇):你想爬爬“流程中台”这座山吗?
  8. 这才是全规格样式车牌识别,秒杀各种“不服”
  9. 动态规划之0-1背包问题(思路详解+表格演示过程+最优解打印方法+详细代码)
  10. 游戏架构 云游戏(3)-游戏运维
  11. DDR5内存条容量计算
  12. 【C语言小游戏】猜数字游戏
  13. SEO是什么?SEO是什么意思?SEO分为两种
  14. 优化新闻管理系统(分层)+代码封装
  15. Matlab对科氏力建模,基于ADAMS和MATLAB的惯性组件联合仿真研究
  16. Python+selenium验证部分文本框内容相符即断言成功
  17. Linux 多线程编程(实现生产者消费者模型)
  18. cs223w课程笔记7-GNN2
  19. 怎么将视频中的声音提取出来?
  20. Linux fork炸弹以及预防办法

热门文章

  1. java和asp.net core_.NET Core和ASP.NET Core简介与区别
  2. python中forward_符合python风格的对象
  3. 2021河北省高考成绩查询步骤,河北省2021年普通高校招生考试和录取工作实施方案解读...
  4. 关于Django综述
  5. PCL:解决PCL和OpenCV冲突的方法
  6. React+Redux仿Web追书神器
  7. 完全虚拟化和半虚拟化区别
  8. linux常用命令之权限
  9. BDB (Berkeley DB)数据库简单介绍(转载)
  10. 推荐5个免费项目管理工具