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.myxmltestimport java
.io.InputStream
import java
.io.StringWriterimport 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.StreamResultimport org
.w3c
.dom.Document
import org
.w3c
.dom.Element
import org
.w3c
.dom.NodeListimport android
.app.Activity
import android
.os.Bundle
import android
.widget.TextViewpublic class MainActivity extends Activity {private TextView text@Overrideprotected void onCreate(Bundle savedInstanceState) {super
.onCreate(savedInstanceState)setContentView(R
.layout.activity_main)initView()dealXML()// createXML()}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()}}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 =
0Element 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);Document doc = Jsoup.parse(html);doc.title();
try {Document doc2 = Jsoup.connect(url).get();
}
catch (IOException e) {e.printStackTrace();}File file =
new File(Environment.getExternalStorageDirectory()+
"/index.html");
try {Document doc3 = Jsoup.parse(file,
"utf-8",
"http://baidu.com");}
catch (IOException e) {e.printStackTrace();}Elements eles = doc.getElementsByTag(
"a");
for (Element link : eles) {String linkHref = link.attr(
"href");String text = link.text();}Elements elements = doc.select(
"a[href]");Elements elements2 = doc.select(
"img[src$=.png]");Element element3 = doc.select(
"div.className").first();doc.select(
"div.className").attr(
"key",
"value");doc.select(
"div.className").addClass(
"myclass");doc.select(
"img").removeAttr(
"onClick");String htmls =
"";String safe = Jsoup.clean(htmls, Whitelist.basic());}
}
使用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();;}
private void parseHtml() {
try {Document doc = Jsoup.connect(url).get();Elements elements = doc.select(
"div.unit");
for (Element element : elements) {String title = element.getElementsByTag(
"h1").first().text();String href = element.getElementsByTag(
"h1").first().getElementsByTag(
"a").first().attr(
"href");
Log.i(
"tag", title);Log.i(
"tag", href);
}}
catch (IOException e) {e.printStackTrace();}}}
原網頁截圖:
對應的網頁源代碼截圖:
根據上圖可以看出每條新聞的相同點:每條新聞的內容都是在<div class="unit">標簽中。
通過上圖可以發現每條新聞中只有一個<h1>標簽。
運行結果截圖:
總結
以上是生活随笔為你收集整理的Andorid中使用Jsoup解析库解析XML、HTML、Dom节点---第三方库学习笔记(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。