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有兩種形式,其分別為:
-
DOM:將標記語言文檔一次性加載進內存,在內存中形成一顆dom樹
-
優點:操作方便,可以對文檔進行CRUD(增刪改查)的所有操作
-
缺點:占內存
-
-
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(); } } }