java讀取xml文件以及Jsoup解析


xml基本介紹

xml基本語法:
1.xml文檔的后綴名為.xml
2.xml第一行必須定義為文檔聲明
3.xml文檔有且僅有一個根標簽
4.屬性值必須使用引號(單雙都可以)引起來
5.標簽必須正確關閉
6.xml標簽名區分大小寫
組成部分
1.文檔聲明 格式:<?xml 屬性列表 ?>
       version:版本號(必須);  encoding:編碼格式;  standalone:是否獨立 取值:yes,no
2.標簽:名稱自定義,並且按照規則
3.屬性:id屬性值唯一
4.文本:CDATA區:在該區域中的數據會被原樣展示,格式:<![CDATA[ 數據 ]]>
約束:規定xml文檔的書寫規則
dtd:簡單的約束技術
schema:復雜的約束技術
DTD:內部dtd:將約束規則定義在xml文檔中;外部dtd:將約束定義在外部dtd文件中
    外部dtd:本地:<! DOCTYPE 根標簽名 SYSTEM "dtd文件的位置">
        網絡:<! DOCTYPE 根標簽名 PUBLIC "dtd文件名字" "dtd文件的位置URL">

java解析xml文件的幾種方法

解析xml有兩種形式,其分別為:

 

  1. DOM:將標記語言文檔一次性加載進內存,在內存中形成一顆dom樹

    • 優點:操作方便,可以對文檔進行CRUD(增刪改查)的所有操作

    • 缺點:占內存

  2. SAX:逐行讀取,基於事件驅動

    • 優點:不占內存

    • 缺點:只能讀取

 

以下面這個簡單的xml文件的解析為例,具體內容參考https://www.w3school.com.cn/xmldom/dom_parser.asp

<?xml version="1.0" encoding="UTF-8"?>
<peoples>
    <people number="1">
        <name id="zs">張三</name>
        <age>12</age>
    </people>
    <people>
        <name>李四</name>
        <age>15</age>
    </people>
</peoples>

 第一種,使用DOM對xml進行解析

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

public class testXml {
    public static void main(String[] args) {
        try{
            File xml = new File("test/test.xml");
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(xml);
            NodeList list = doc.getElementsByTagName("people");
            for(int i=0;i<list.getLength();i++){
                Element e = (Element)list.item(i);
                System.out.println("姓名:"+e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()
                        +"年齡:"+e.getElementsByTagName("age").item(0).getFirstChild().getNodeValue());
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

 第二種形式,DOM4J進行解析

import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;

public class testDOM4J {
    public static void main(String[] args) {
        try{
            File f = new File("test/test.xml");
            SAXReader reader = new SAXReader();
            Document doc = reader.read(f);
            Element root = doc.getRootElement();
            Element n;
            for (Iterator i=root.elementIterator("people");i.hasNext();) {
                n = (Element) i.next();
                System.out.println("姓名:"+n.elementText("name")+" 年齡:"+n.elementText("age"));
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

 第三種形式,JDOM進行解析

 

import java.util.*;
import org.jdom2.*;
import org.jdom2.input.*;


import java.io.File;

public class testJDOM {
    public static void main(String[] args) {
        try{
            File f = new File("test/test.xml");
            SAXBuilder builder = new SAXBuilder();
            Document doc = builder.build(f);
            Element e = doc.getRootElement();
            List li = e.getChildren();
            Element temp;
            for(int i=0;i<li.size();i++){
                temp = (Element) li.get(i);
                System.out.println("姓名:"+temp.getChild("name").getText()+" 年齡:"+temp.getChild("age").getText());
            }

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

 Jsoup是一款Java 的HTML解析器,可直接解析某個URL地址、HTML、XML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作數據。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;

public class testJsoup {
    public static void main(String[] args) {
        try{
            //1.獲取xml解析文件的路徑
            File f = new File("test/test.xml");
            //2.解析xml文檔,加載文檔進內存,獲取Jsoup 的document對象
            Document document = Jsoup.parse(f,"UTF-8");
            //解析xml
            Elements elements = document.getElementsByTag("name");
            for(int i=0;i<elements.size();i++){
                System.out.println("姓名:"+elements.get(i).text());
            }

        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

 其中:

parse方法:解析xml或html對象。

Document :文檔對象。代表內存中的dom樹。

獲取Element對象:1.根據標簽名獲取對象集合  public Elements getElementsByTag(String tagName)。

         2.根據屬性名稱獲取對象集合 public Elements getElementsByAttribute(String key)

         3.根據對應的屬性名和值獲取元素對象集合 public Elements getElementsByAttributeValue(String key, String value)

         4.根據ID屬性獲取唯一的element public Element getElementById​(String id)

Elements :Element對象的集合。可以當作ArrayList來使用

Element :元素對象

  *獲取子元素對象

  *獲取屬性值 String attr(String key)

  *獲取文本內容  String text()

Node :節點對象 Document和Element的父類

快速查詢方式

1.selector選擇器: 使用的方法:Elements select(String cssQuery)

2.XPath。使用Jsoup的xpath需要額外導入jar包。具體可以查詢w3cschool參考手冊

兩種方法的示例代碼

1.selector選擇器

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;

public class testJsoup {
    public static void main(String[] args) {
        try{
            //1.獲取xml解析文件的路徑
            File f = new File("test/test.xml");
            //2.解析xml文檔,加載文檔進內存,獲取Jsoup 的document對象
            Document document = Jsoup.parse(f,"UTF-8");
            //使用選擇器進行查詢,查詢name標簽
            Elements elements = document.select("name");
            System.out.println(elements.get(0).text());
            //根據id進行查詢
            Elements id = document.select("#zs");
            System.out.println(id.get(0).text());
            //根據值查找
            Elements select = document.select("people[number=\"1\"]");
            System.out.println(select.text());
            //查找people中number等於1中的age子標簽
            Elements select1 = document.select("people[number=\"1\"]>age");
            System.out.println(select1.text());

        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

 2.XPATH

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


import java.io.File;

public class testJsoupXpath {
    public static void main(String[] args) {
        try{
            //1.獲取xml解析文件的路徑
            File f = new File("test/test.xml");
            //2.解析xml文檔,加載文檔進內存,獲取Jsoup 的document對象
            Document document = Jsoup.parse(f,"UTF-8");
            //劇創建JXDocumnet對象
            JXDocument jxDocument=new JXDocument(document);
            //結合xpath語法查詢
            List<JXNode> jxNodes = jxDocument.selN("//people");
            System.out.println(jxNodes);

            List<JXNode> jxNode = jxDocument.selN("//people[@number='1']");
            System.out.println(jxNode);

        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM