【愚公系列】2022年01月 Java教學課程 75-xml文件的介紹和解析

      網友投稿 737 2025-03-31

      一、xml


      1.概述

      萬維網聯盟(W3C)

      萬維網聯盟(W3C)創建于1994年,又稱W3C理事會。1994年10月在麻省理工學院計算機科學實驗室成立。

      建立者: Tim Berners-Lee (蒂姆·伯納斯·李)。

      是Web技術領域最具權威和影響力的國際中立性技術標準機構。

      到目前為止,W3C已發布了200多項影響深遠的Web技術標準及實施指南,

      如廣為業界采用的超文本標記語言HTML(標準通用標記語言下的一個應用)、

      可擴展標記語言XML(標準通用標記語言下的一個子集)

      以及幫助殘障人士有效獲得Web信息的無障礙指南(WCAG)等

      xml概述

      XML的全稱為(EXtensible Markup Language),是一種可擴展的標記語言

      標記語言: 通過標簽來描述數據的一門語言(標簽有時我們也將其稱之為元素)

      可擴展:標簽的名字是可以自定義的,XML文件是由很多標簽組成的,而標簽名是可以自定義的

      作用

      用于進行存儲數據和傳輸數據

      作為軟件的配置文件

      作為配置文件的優勢

      可讀性好

      可維護性高

      【愚公系列】2022年01月 Java教學課程 75-xml文件的介紹和解析

      2.標簽的規則

      標簽由一對尖括號和合法標識符組成

      標簽必須成對出現

      前邊的是開始標簽,后邊的是結束標簽

      特殊的標簽可以不成對,但是必須有結束標記

      標簽中可以定義屬性,屬性和標簽名空格隔開,屬性值必須用引號引起來

      標簽需要正確的嵌套

      這是正確的: 張三 這是錯誤的: 張三

      3.語法規則

      語法規則

      XML文件的后綴名為:xml

      文檔聲明必須是第一行第一列

      version:該屬性是必須存在的

      encoding:該屬性不是必須的

      打開當前xml文件的時候應該是使用什么字符編碼表(一般取值都是UTF-8)

      standalone: 該屬性不是必須的,描述XML文件是否依賴其他的xml文件,取值為yes/no

      必須存在一個根標簽,有且只能有一個

      XML文件中可以定義注釋信息

      XML文件中可以存在以下特殊字符

      < < 小于 > > 大于 & & 和號 ' ' 單引號 " " 引號

      XML文件中可以存在CDATA區

      示例代碼

      張三 23 學生< >>>>>>>>>>>的信息 >>>>> ]]]> 李四 24

      4.xml解析

      概述

      xml解析就是從xml中獲取到數據

      常見的解析思想

      DOM(Document Object Model)文檔對象模型:就是把文檔的各個組成部分看做成對應的對象。

      會把xml文件全部加載到內存,在內存中形成一個樹形結構,再獲取對應的值

      常見的解析工具

      JAXP: SUN公司提供的一套XML的解析的API

      JDOM: 開源組織提供了一套XML的解析的API-jdom

      DOM4J: 開源組織提供了一套XML的解析的API-dom4j,全稱:Dom For Java

      pull: 主要應用在Android手機端解析XML

      解析的準備工作

      我們可以通過網站:https://dom4j.github.io/ 去下載dom4j

      今天的資料中已經提供,我們不用再單獨下載了,直接使用即可

      將提供好的dom4j-1.6.1.zip解壓,找到里面的dom4j-1.6.1.jar

      在idea中當前模塊下新建一個libs文件夾,將jar包復制到文件夾中

      選中jar包 -> 右鍵 -> 選擇add as library即可

      需求

      解析提供好的xml文件

      將解析到的數據封裝到學生對象中

      并將學生對象存儲到ArrayList集合中

      遍歷集合

      代碼實現

      張三 23 李四 24 // 上邊是已經準備好的student.xml文件 public class Student { private String id; private String name; private int age; public Student() { } public Student(String id, String name, int age) { this.id = id; this.name = name; this.age = age; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", age=" + age + '}'; } } /** * 利用dom4j解析xml文件 */ public class XmlParse { public static void main(String[] args) throws DocumentException { //1.獲取一個解析器對象 SAXReader saxReader = new SAXReader(); //2.利用解析器把xml文件加載到內存中,并返回一個文檔對象 Document document = saxReader.read(new File("myxml\\xml\\student.xml")); //3.獲取到根標簽 Element rootElement = document.getRootElement(); //4.通過根標簽來獲取student標簽 //elements():可以獲取調用者所有的子標簽.會把這些子標簽放到一個集合中返回. //elements("標簽名"):可以獲取調用者所有的指定的子標簽,會把這些子標簽放到一個集合中并返回 //List list = rootElement.elements(); List studentElements = rootElement.elements("student"); //System.out.println(list.size()); //用來裝學生對象 ArrayList list = new ArrayList<>(); //5.遍歷集合,得到每一個student標簽 for (Element element : studentElements) { //element依次表示每一個student標簽 //獲取id這個屬性 Attribute attribute = element.attribute("id"); //獲取id的屬性值 String id = attribute.getValue(); //獲取name標簽 //element("標簽名"):獲取調用者指定的子標簽 Element nameElement = element.element("name"); //獲取這個標簽的標簽體內容 String name = nameElement.getText(); //獲取age標簽 Element ageElement = element.element("age"); //獲取age標簽的標簽體內容 String age = ageElement.getText(); // System.out.println(id); // System.out.println(name); // System.out.println(age); Student s = new Student(id,name,Integer.parseInt(age)); list.add(s); } //遍歷操作 for (Student student : list) { System.out.println(student); } } }

      5.DTD約束

      什么是約束

      用來限定xml文件中可使用的標簽以及屬性

      約束的分類

      DTD

      schema

      編寫DTD約束

      步驟

      創建一個文件,這個文件的后綴名為.dtd

      看xml文件中使用了哪些元素

      判斷元素是簡單元素還是復雜元素

      簡單元素:沒有子元素。

      復雜元素:有子元素的元素;

      代碼實現

      引入DTD約束

      引入DTD約束的三種方法

      引入本地dtd

      在xml文件內部引入

      引入網絡dtd

      代碼實現

      引入本地DTD約束

      // 這是persondtd.dtd文件中的內容,已經提前寫好 // 在person1.xml文件中引入persondtd.dtd約束 張三 23

      在xml文件內部引入

      ]> 張三 23

      引入網絡dtd

      張三 23

      DTD語法

      定義元素

      定義一個元素的格式為:

      簡單元素:

      EMPTY: 表示標簽體為空

      ANY: 表示標簽體可以為空也可以不為空

      PCDATA: 表示該元素的內容部分為字符串

      復雜元素:

      直接寫子元素名稱. 多個子元素可以使用",“或者”|"隔開;

      ","表示定義子元素的順序 ; “|”: 表示子元素只能出現任意一個

      "?"零次或一次, "+"一次或多次, "*"零次或多次;如果不寫則表示出現一次

      定義屬性

      格式

      定義一個屬性的格式為:

      屬性的類型:

      CDATA類型:普通的字符串

      屬性的約束:

      // #REQUIRED: 必須的

      // #IMPLIED: 屬性不是必需的

      // #FIXED value:屬性值是固定的

      代碼實現

      張三 23 張三 23 ```

      6.schema約束

      schema和dtd的區別

      schema約束文件也是一個xml文件,符合xml的語法,這個文件的后綴名.xsd

      一個xml中可以引用多個schema約束文件,多個schema使用名稱空間區分(名稱空間類似于java包名)

      dtd里面元素類型的取值比較單一常見的是PCDATA類型,但是在schema里面可以支持很多個數據類型

      schema 語法更加的復雜

      編寫schema約束

      步驟

      1,創建一個文件,這個文件的后綴名為.xsd。

      2,定義文檔聲明

      3,schema文件的根標簽為:

      4,在中定義屬性:

      xmlns=http://www.w3.org/2001/XMLSchema

      5,在中定義屬性 :

      targetNamespace =唯一的url地址,指定當前這個schema文件的名稱空間。

      6,在中定義屬性 :

      elementFormDefault="qualified“,表示當前schema文件是一個質量良好的文件。

      7,通過element定義元素

      8,判斷當前元素是簡單元素還是復雜元素

      代碼實現

      引入schema約束

      步驟

      1,在根標簽上定義屬性xmlns=“http://www.w3.org/2001/XMLSchema-instance”

      2,通過xmlns引入約束文件的名稱空間

      3,給某一個xmlns屬性添加一個標識,用于區分不同的名稱空間

      格式為: xmlns:標識=“名稱空間地址” ,標識可以是任意的,但是一般取值都是xsi

      4,通過xsi:schemaLocation指定名稱空間所對應的約束文件路徑

      格式為:xsi:schemaLocation = "名稱空間url 文件路徑“

      代碼實現

      張三 23 ```

      schema約束定義屬性

      代碼示例

      張三 23 ```

      7.服務器改進

      準備xml文件

      在當前模塊下的webapp目錄下新建一個文件夾,名字叫WEB-INF

      新建一個xml文件,名字叫web.xml

      將資料中的web.xml文件中引入約束的代碼復制到新建的web.xml文件中

      將要解析的數據配置到xml文件中

      需求

      把uri和servlet信息放到一個ConcurrentHashMap集合當中

      當瀏覽器請求一個動態資源時,我們會獲取uri對應的servlet來處理當前業務

      實現步驟

      導入dom4j的jar包

      定義一個XmlParseServletConfig類實現ParseServletConfig接口

      在parse方法里面就可以解析xml文件了

      代碼實現

      // web.xml配置文件中配置的信息 LoginServlet com.itheima.myservlet.LoginServlet LoginServlet /servlet/loginservlet // 定義一個XmlParseServletConfig類實現ParseServletConfig接口 public class XMLParseServletConfig implements ParseServletConfig { //定義web.xml文件的路徑 private static final String WEB_XML_PATH = "http-dynamic-server/webapp/WEB-INF/web.xml"; //在parse方法里面就可以解析xml文件了 @Override public void parse() { try { //1.創建一個解析器對象(注意:如果解析器對象等不能使用,請檢查一下jar包是否導入) SAXReader saxReader = new SAXReader(); //2.利用解析器把xml文件讀取到內存中 Document document = saxReader.read(new File(WEB_XML_PATH)); //3.獲取根節點元素對象 Element rootElement = document.getRootElement(); //創建一個Map集合,用來存儲servlet的配置信息 HashMap servletInfoHashMap = new HashMap<>(); //4.獲取根元素對象下所有的servlet元素的對象 List servletInfos = rootElement.elements("servlet"); //5.遍歷集合,依次獲取到每一個servlet標簽對象 for (Element servletInfo : servletInfos) { //servletInfo依次表示每一個servlet標簽對象 //獲取到servlet下的servlet-name元素對象,并且獲取標簽體內容 String servletName = servletInfo.element("servlet-name").getText(); //獲取到servlet下的servlet-class元素對象,并且獲取標簽體內容 String servletClass = servletInfo.element("servlet-class").getText(); servletInfoHashMap.put(servletName,servletClass); } //--------------------servlet-mapping-------------------------------------- //獲取到所有的servlet-mapping標簽 List servletMappingInfos = rootElement.elements("servlet-mapping"); //遍歷集合依次得到每一個servlet-mapping標簽 for (Element servletMappingInfo : servletMappingInfos) { //servletMappingInfo依次表示每一個servlet-mapping標簽 //獲取servlet-mapping標簽標簽中的servlet-name標簽的標簽體內容 String servletName = servletMappingInfo.element("servlet-name").getText(); //獲取servlet-mapping標簽標簽中的url-pattern標簽的標簽體內容 String urlPattern = servletMappingInfo.element("url-pattern").getText(); //通過servletName來獲取到servlet的全類名 String servletClassName = servletInfoHashMap.get(servletName); //通過反射來創建這個servlet對象 Class clazz = Class.forName(servletClassName); //獲取該類所實現的所有的接口信息,得到的是一個數組 Class[] interfaces = clazz.getInterfaces(); //定義一個boolean類型的變量 boolean flag = false; //遍歷數組 for (Class clazzInfo : interfaces) { //判斷當前所遍歷的接口的字節碼對象是否和HttpServlet的字節碼文件對象相同 if(clazzInfo == HttpServlet.class){ //如果相同,就需要更改flag值.結束循環 flag = true; break; } } if(flag){ //true就表示當前的類已經實現了HttpServlet接口 HttpServlet httpServlet = (HttpServlet) clazz.newInstance(); //4.將uri和httpServlet添加到map集合中 ServletConcurrentHashMap.map.put(urlPattern,httpServlet); }else{ //false就表示當前的類還沒有實現HttpServlet接口 throw new NotImplementsHttpServletException(clazz.getName() + "Not Implements HttpServlet"); } } } catch (NotImplementsHttpServletException e) { e.printStackTrace(); }catch (Exception e) { e.printStackTrace(); } } } public class LoaderResourceRunnable implements Runnable { @Override public void run() { // //執行parse方法 // ParseServletConfig parseServletConfig = new PropertiesParseServletConfig(); // parseServletConfig.parse(); ParseServletConfig parseServletConfig = new XMLParseServletConfig(); parseServletConfig.parse(); } }

      5G教育 Java XML

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:個性字帖DIY
      下一篇:Excel2019調整單元格大小的方法
      相關文章
      亚洲黄色在线网站| 亚洲午夜久久影院| 亚洲人和日本人jizz| 国产成人麻豆亚洲综合无码精品 | 亚洲私人无码综合久久网| 97亚洲熟妇自偷自拍另类图片 | 伊人久久亚洲综合影院| 朝桐光亚洲专区在线中文字幕 | 亚洲AV无码精品国产成人| www亚洲精品久久久乳| 亚洲AV女人18毛片水真多| 亚洲AV综合永久无码精品天堂| 亚洲av永久无码一区二区三区| 日韩欧美亚洲中文乱码| 豆国产96在线|亚洲| 亚洲第一黄片大全| 亚洲熟女乱综合一区二区| 久久久久国产亚洲AV麻豆| 亚洲精品亚洲人成在线观看| 亚洲AV无码久久精品狠狠爱浪潮| 亚洲国产高清在线| 亚洲精品无码久久久久久久 | 亚洲色图激情文学| 亚洲国产成人精品无码区二本| 亚洲国产精华液2020| 亚洲国产精品尤物yw在线| 91麻豆国产自产在线观看亚洲 | 亚洲精品午夜国产va久久| 亚洲精品无码专区| 亚洲国产精品人人做人人爽| 亚洲深深色噜噜狠狠爱网站| 亚洲va无码手机在线电影| 亚洲高清资源在线观看| 亚洲日本国产综合高清| 国产成人亚洲精品无码AV大片 | 亚洲乱码一区av春药高潮| 亚洲午夜理论片在线观看| 日韩精品亚洲专区在线观看| 国产亚洲精品影视在线产品| 久久亚洲国产精品五月天| 亚洲影视一区二区|