一、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文件是由很多標簽組成的,而標簽名是可以自定義的
作用
用于進行存儲數據和傳輸數據
作為軟件的配置文件
作為配置文件的優勢
可讀性好
可維護性高

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小時內刪除侵權內容。