日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

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

發布時間:2023/12/20 HTML 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Andorid中使用Jsoup解析库解析XML、HTML、Dom节点---第三方库学习笔记(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

XML介紹:

XML簡介:

  • XML,可擴展標記語言,標準通用標記語言的子集。
  • 一種用于標記電子文件使其具有結構性的標記語言。
  • 它可以用來標記數據、定義數據類型
  • 是一種允許用戶對自己的標記語言進行定義的源語言。
  • 非常適合萬維網傳輸
  • 提供統一方法描述和交換獨立于應用程序或供應商的結構化數據

XML的特點:

  • XML是一種標記語言,很類似HTML
  • XML的設計宗旨是傳輸數據,而非顯示數據
  • XML標簽沒有被預定義,需要自行定義標簽
  • XML被設計為具有自我描述性
  • XML是W3C的推薦標準

    XML與HTML對比:

  • XML和HTML是為不同目的而設計:
  • XML被設計為傳輸和存儲數據,其焦點是數據的內容

  • HTML被設計用來顯示數據,其焦點是數據的外觀
  • HTML旨在顯示數據,而XML旨在傳輸數據

2.XML僅僅是純文本
有能力處理純文本的軟件都可以處理XML。不過能夠讀懂XML的應用程序可以有針對的處理XML的標簽。標簽的功能性意義依賴于應用程序的特性。

3.XML沒有預定義的標簽
在HTML中使用的標簽(以及HTML的結構)是預定義的。HTML文檔只使用在HTML標準中定義過的標簽。

XML的語法規則:

  • 在XML中,省略關閉標簽是非法的,所有標簽都必須有關閉標簽。
  • XML標簽對對大小寫敏感
  • XML必須正確的嵌套
  • XML文檔必須有根元素
  • XML的屬性值必須加引號
  • 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基本用法:

  • 分析Html或Dom文本的結點標簽結構
  • 尋找你要解析的那個內容部分所在的結點標記
  • 調用Jsoup API解析結點內容
  • 代碼演示:

  • 使用Jsoup載入Html數據
  • 使用Jsoup解析并提取HTML元素
  • 使用Jsoup修改數據
  • 使用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节点---第三方库学习笔记(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。