java中XML的使用全過(guò)程
什么是XML
XML(EXtensible Markup Language),可擴(kuò)展標(biāo)記語(yǔ)言,是一種簡(jiǎn)單的基于文本的語(yǔ)言,旨在以村文本格式存儲(chǔ)和傳輸數(shù)據(jù),他代表可擴(kuò)展標(biāo)記語(yǔ)言。
- 1、作為系統(tǒng)的配置文件
- 2、作為一種特殊的數(shù)據(jù)結(jié)構(gòu),在網(wǎng)絡(luò)中進(jìn)行傳輸
特點(diǎn)
XML與操作系統(tǒng)、編程語(yǔ)言的開發(fā)平臺(tái)無(wú)關(guān)
實(shí)現(xiàn)不同系統(tǒng)之間的數(shù)據(jù)交換
XML作用
- 數(shù)據(jù)交互
- 配置應(yīng)用程序和網(wǎng)站
- Ajax基石
XML的編寫語(yǔ)法
基本語(yǔ)法
- 所有XML元素都必須有結(jié)束標(biāo)簽
- XML標(biāo)簽對(duì)大小寫敏感
- XML必須正確的嵌套
- 同級(jí)標(biāo)簽以縮進(jìn)對(duì)齊
- 元素名稱可以包含字母、數(shù)字或其他的字符
- 元素名稱不能以數(shù)字或者標(biāo)點(diǎn)符號(hào)開始
- 元素名稱中不能含空格
<?xml version="1.0" encoding="UTF-8"?> <books> <!--圖書信息 這是注釋--> <book id="bk101"> <author>王珊</author> <title>.NET高級(jí)編程</title> <description>包含C#框架和網(wǎng)絡(luò)編程等</description> </book> <book id="bk102"> <author>李明明</author> <title>XML基礎(chǔ)編程</title> <description>包含XML基礎(chǔ)概念和基本作用</description> </book> </books>
注意一:<?xml version="1.0" encoding="utf-8" ?>這行是必須要寫的,且必須放在首行(前面有注釋都不行)。表示版本為1.0,以u(píng)tf-8字符集來(lái)編碼
- 注意二:根標(biāo)簽只能有一個(gè),子標(biāo)簽可以有多個(gè)
- 注意三:標(biāo)簽是成對(duì)存在的,記得嵌套正確
XML文件可以在瀏覽器中查看,我們打開瀏覽器看到,我們寫的特殊字符的格式是我們所預(yù)期的
特殊字符編寫
1、 指定字符替代特殊字符
XML中書寫”<’
“&”等,可能會(huì)出現(xiàn)沖突,導(dǎo)致報(bào)錯(cuò),此時(shí)可以用如下特殊字符替代。
指定字符 | 特殊字符 | 含義 |
---|---|---|
< | < | 小于 |
> | > | 大于 |
& | & | 小于 |
' | ’ | 單引號(hào) |
" | " | 雙引號(hào) |
2、CDATA的數(shù)據(jù)區(qū)
XML中可以寫一個(gè)叫CDATA的數(shù)據(jù)區(qū):<![CDATA[..內(nèi)容... ]]>,里面的內(nèi)容可以隨便寫
<Users> <user id="1"> <name>張三</name> <age>18</age> <address>廣州</address> </user> <userAttribute>都是愛學(xué)習(xí)的人</userAttribute> <user id="2"> <name>李四</name> <age>25</age> <address>哈爾濱</address> </user> <!--以下是帶有大于號(hào)小于號(hào)等特殊字符的寫法--> <special> <![CDATA[ 5 > 2 && 3 < 5 ]]> </special> <!--特殊字符用法二--> <special> 5 > 2 && 3 < 5 </special> </Users>
約束XML的書寫格式
DTD文檔
特點(diǎn)
- 可以約束XML文件的編寫
- 不能約束具體的數(shù)據(jù)類型
DTD文檔的使用
①:編寫DTD約束文檔,后綴必須是.dtd
data.dtd
根目錄只能叫做書并且可以有多個(gè)書的子元素
書只能由書名作者售價(jià)構(gòu)成
<!ELEMENT 書架 (書+)> <!ELEMENT 書 (書名,作者,售價(jià))> <!ELEMENT 書名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售價(jià) (#PCDATA)>
②:在需要編寫的XML文件中導(dǎo)入該DTD約束文檔
<!DOCTYPE 書架 SYSTEM "data.dtd">
③:然后XML文件,就必須按照DTD約束文檔指定的格式進(jìn)行編寫,否則報(bào)錯(cuò)
<?xml version="1.0" encoding="UTF-8"?> <!-- 導(dǎo)入約束格式 --> <!DOCTYPE 書架 SYSTEM "data.dtd"> <書架> <!-- 只能這么寫否則報(bào)錯(cuò) --> <書> <書名>哈利波特</書名> <作者>J.K.羅琳</作者> <!-- 售價(jià)的類型可以是浮點(diǎn)型,字符串,也可以是任何數(shù)據(jù)類型 --> <售價(jià)>49.9</售價(jià)> </書> <書> <書名>西游記</書名> <作者>吳承恩</作者> <售價(jià)>49.9</售價(jià)> </書> </書架>
schema文檔
特點(diǎn)
- 可以約束XML文件的編寫
- 可以約束具體的數(shù)據(jù)類型
schema文檔的使用
1、編寫schema約束文檔,后綴必須是.xsd,具體的形式到代碼中觀看。
2、在需要編寫的XML文件中導(dǎo)入該schema約束文檔
3、按照約束內(nèi)容編寫XML文件的標(biāo)簽
<?xml version="1.0" encoding="UTF-8"?> <!-- xmlns: 核心命名空間聲明 --> <!-- xmlns="http://www.w3.org/2001/XMLSchema: 聲明使用W3C XML Schema規(guī)范作為默認(rèn)命名空間,所有未加前綴的標(biāo)簽均屬于該規(guī)范。 --> <!-- targetNamespace(目標(biāo)命名空間): 申明約束文檔的地址(命名空間) 這里的data.xsd也是被約束的 --> <!-- elementFormDefault(元素命名空間規(guī)則): 先不用管,這是關(guān)于局部元素的命名空間歸屬的屬性--> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.cn" elementFormDefault="qualified" > <!--全局元素定義,作為根元素,該元素直接屬于targetNamespace命名空間--> <element name="書架"> <complexType> <!-- maxOccurs="unbounded" 書架下的子元素可以有無(wú)窮多個(gè) --> <sequence maxOccurs="unbounded"> <element name="書"> <!-- 寫子元素 --> <complexType> <sequence> <element name="書名" type="string"/> <element name="作者" type="string"/> <element name="價(jià)格" type="double"/> </sequence> </complexType> </element> </sequence> </complexType> </element> </schema>
屬性命名空間
<?xml version="1.0" encoding="UTF-8"?> <batchCompany xmlns="http://www.Aptech_edu.ac" xmlns:tea="http://www.tea.org"> <batch-list> <!-- 下面這個(gè)命名空間屬于xmlns:tea="http://www.Aptech_edu.ac" --> <batch type="thirdbatch">第三批次</batch> <!-- 下面這個(gè)命名空間屬于xmlns:tea="http://www.tea.org" --> <batch tea:type="thirdbatch">第三批茶</batch> <!-- 下面這個(gè)命名空間屬于xmlns:tea="http://www.Aptech_edu.ac" --> <batch>午班批次</batch> </batch-list> </batchCompany>
除非帶有前綴,否則屬性屬于所屬的元素的命名空間
XML命名空間的作用
解決在復(fù)雜、大型XML文件中,出現(xiàn)名稱相同,但是含義不同的元素
<?xml version="1.0" encoding="UTF-8"?> <!-- 兩個(gè)廠家(佳能相機(jī)和尼康相機(jī))的地址 --> <cameras xmlns:canon="http://www.canon" xmlns:nikon="http://www.nikon.com"> <!-- 雖然都是相機(jī)camera 但是第一個(gè)是canon(佳能牌)的相機(jī) 第二個(gè)是nikon(尼康牌)的相機(jī) --> <canon:camera prodID="P663" name="Camera傻瓜相機(jī)"/> <nikon:camera prodID=“K29B3” name=“Camera超級(jí)35毫米相機(jī)"/> </cameras>
解析XML的方法
本節(jié)分三塊
DOM(內(nèi)置解析XML)
- 基于XML文檔樹結(jié)構(gòu)的解析
- 適用于多次訪問(wèn)的XML文檔
- 特點(diǎn):比較消耗資源
SAX(內(nèi)置解析XML)
- 基于事件的解析
- 適用于大數(shù)據(jù)量的XML文檔
- 特點(diǎn):占用資源少,內(nèi)存消耗小
DOM4J
- 非常優(yōu)秀的Java XML API
- 性能優(yōu)異、功能強(qiáng)大
- 開放源代碼
??DOM解析XML
基于XML文檔樹結(jié)構(gòu)的解析
適用于多次訪問(wèn)的XML文檔
特點(diǎn):比較消耗資源
DOM介紹
文檔對(duì)象模型(Document Object Model)
DOM把XML文檔映射成一個(gè)倒掛的樹
DOM解析包:org.w3c.dom
org.w3c.dom?? 是 Java 中用于處理 ??文檔對(duì)象模型(DOM)?? 的核心包,由 ??萬(wàn)維網(wǎng)聯(lián)盟(W3C)?? 制定并維護(hù)。它是 W3C DOM 標(biāo)準(zhǔn)的 Java 語(yǔ)言綁定實(shí)現(xiàn),主要用于解析、訪問(wèn)和操作 XML/HTML 文檔的結(jié)構(gòu)化內(nèi)容。(jdk自帶的用于解析xml文件的API)
常用接口
常用接口 | 常用方法 | 說(shuō)明 |
---|---|---|
Document:表示整個(gè) XML 文檔 | NodeList getElementsByTagName(String Tag) | 按文檔順序返回文檔中指定標(biāo)記名稱的所有元素集合 |
Element createElement(String tagName) | 創(chuàng)建指定標(biāo)記名稱的元素 | |
Node:該文檔樹中的單個(gè)節(jié)點(diǎn) | NodeList getChildNodes() | 獲取該元素的所有子節(jié)點(diǎn),返回節(jié)點(diǎn)集合 |
Element:XML 文檔中的一個(gè)元素 | String getTagName() | 獲取元素名稱 |
DOM解析包的使用
DOM解析XML文件步驟
- 創(chuàng)建解析器工廠對(duì)象
- 解析器工廠對(duì)象創(chuàng)建解析器對(duì)象
- 解析器對(duì)象指定XML文件創(chuàng)建Document對(duì)象
- 以Document對(duì)象為起點(diǎn)操作DOM樹
<?xml version="1.0" encoding="utf-8"?> <PhoneInfo> <Brand name="華為"> <Type name="U8650"/> <Type name="HW123"/> <Type name="HW321"/> </Brand> <Brand name="蘋果"> <Type name="iPhone4"/> </Brand> </PhoneInfo>
顯示phoneinfo.xml
文件中收藏的手機(jī)品牌和型號(hào)
package com.hsh.exercise2; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; public class Main { public static void main(String[] args) throws Exception { // 創(chuàng)建解析器工廠對(duì)象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 解析器工廠對(duì)象創(chuàng)建解析器對(duì)象 DocumentBuilder db = factory.newDocumentBuilder(); // 解析 XML 文件 Document document = db.parse("./src/com/hsh/exercise2/phoneinfo.xml"); // 獲取根元素 Element root = document.getDocumentElement(); // 獲取所有 Brand 元素 NodeList brandList = root.getElementsByTagName("Brand"); // 遍歷每個(gè) Brand 節(jié)點(diǎn)并打印 name 屬性 for (int i = 0; i < brandList.getLength(); i++) { // 獲取 Brand 元素 Element brand = (Element) brandList.item(i); // 獲取節(jié)點(diǎn)名稱 System.out.print(brand.getNodeName()+": "); // 獲取 name 屬性 System.out.print(brand.getAttribute("name")+","); // 獲取節(jié)點(diǎn)文本內(nèi)容 由于是單標(biāo)簽所以為空。 // System.out.println(brand.getTextContent()); // 獲取Brand 元素下面的 Type 元素 NodeList typeLists = brand.getElementsByTagName("Type"); for (int j = 0; j < typeLists.getLength(); j++) { // 獲取 Type 元素 Element type = (Element) typeLists.item(j); // 獲取節(jié)點(diǎn)名稱 System.out.print(type.getNodeName()+": "); // 獲取 name 屬性 System.out.print(type.getAttribute("name")+" "); } System.out.println(); } // 輸出結(jié)果 // Brand: 華為,Type: U8650 Type: HW123 Type: HW321 // Brand: 蘋果,Type: iPhone4 } }
保存XML文件
步驟
- 獲得TransformerFactory對(duì)象
- 創(chuàng)建Transformer對(duì)象
- 創(chuàng)建DOMSource對(duì)象:包含XML信息
- 設(shè)置輸出屬性:編碼格式
- 創(chuàng)建StreamResult對(duì)象:包含保存文件的信息
- 將XML保存到指定文件中
package com.hsh.exercise3; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.bootstrap.DOMImplementationRegistry; import org.w3c.dom.ls.DOMImplementationLS; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; public class Main { public static void main(String[] args) throws Exception { //1. 創(chuàng)建工廠TransformerFactory對(duì)象 TransformerFactory factory = TransformerFactory.newInstance(); //2. 創(chuàng)建Transformer對(duì)象 Transformer transformer = factory.newTransformer(); // 3. 創(chuàng)建Document對(duì)象來(lái)創(chuàng)建新的XML文件,給XML文件設(shè)置內(nèi)容,并將DOM結(jié)構(gòu)添加到DOMsource對(duì)象 // 3.1 創(chuàng)建Document對(duì)象 DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = documentFactory.newDocumentBuilder(); Document document = builder.newDocument(); // 3.2 創(chuàng)建XML結(jié)構(gòu)(即給XML文件設(shè)置內(nèi)容) // 創(chuàng)建根元素 Element root = document.createElement("root"); // 加入到document中 document.appendChild(root); // 創(chuàng)建子元素 Element child = document.createElement("child"); // 設(shè)置屬性名和屬性值 child.setAttribute("name", "hsh"); // 設(shè)置元素內(nèi)容 child.appendChild(document.createTextNode("Text Content")); //加入根節(jié)點(diǎn)樹中 root.appendChild(child); // 3.3 將文件添加到DOMsource對(duì)象中 DOMSource source = new DOMSource(document); // 4. 給第二步 的Transformer對(duì)象設(shè)置輸出屬性 // 4.1設(shè)置是否再XML中添加縮進(jìn) transformer.setOutputProperty(OutputKeys.INDENT,"yes"); // 4.2指定輸出方法 transformer.setOutputProperty(OutputKeys.METHOD, "xml"); // 4.3指定輸出文件編碼 transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); // 5. 創(chuàng)建StreamResult對(duì)象,指定輸出文件 StreamResult對(duì)象包含了文件信息 StreamResult result = new StreamResult("./src/com/hsh/exercise3/collection.xml"); // 6. 將DOMsource對(duì)象和StreamResult對(duì)象作為參數(shù)傳遞給Transformer對(duì)象的transform方法進(jìn)行保存 transformer.transform(source, result); System.out.println("保存成功!"); } }
保存后的文件如下
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <root> <child name="hsh">Text Content</child> </root>
添加DOM節(jié)點(diǎn)
添加手機(jī)收藏
- 添加新的Brand:三星
- 給Brand節(jié)點(diǎn)添加新的子標(biāo)簽Type:Note4
- 將Brand添加到DOM樹中
練習(xí):給手機(jī)收藏信息XML中添加新的手機(jī)信息,并將手機(jī)收藏信息保存到新文件中
添加新的Brand:三星
給Brand節(jié)點(diǎn)添加新的子標(biāo)簽Type:Note4
將Brand添加到DOM樹中
package com.hsh.exercise3; import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; public class Main { public static void main(String[] args) throws Exception { // 創(chuàng)建解析器工廠對(duì)象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder db = factory.newDocumentBuilder(); Document document = db.parse("./src/com/hsh/exercise3/收藏信息.xml"); // 獲取根元素 Element root = document.getDocumentElement(); System.out.println(root.getNodeName()); // 給根元素添加子元素Brand Element brand = document.createElement("Brand"); brand.setAttribute("name","三星"); // 給Brand 元素添加子元素Type Element type = document.createElement("Type"); // 設(shè)置Type的屬性 type.setAttribute("name","Note4"); // 將Type添加到Brand中 brand.appendChild(type); root.appendChild(brand); // 創(chuàng)建工廠進(jìn)行保存 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); // 設(shè)置格式化 // 縮進(jìn) transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 指定輸出 transformer.setOutputProperty(OutputKeys.METHOD, "xml"); // 指定編碼 transformer.setOutputProperty(OutputKeys.ENCODING, "GB2312"); DOMSource domSource = new DOMSource(document); StreamResult streamResult = new StreamResult("./src/com/hsh/exercise3/收藏信息.xml"); transformer.transform(domSource, streamResult); System.out.println("保存成功"); } }
修改/刪除DOM節(jié)點(diǎn)
給所有的Brand標(biāo)簽添加id屬性
- 獲取Brand標(biāo)簽
- 調(diào)用setAttribute()方法添加屬性
刪除Brand值為“華為”的標(biāo)簽
- getElementsByTagName()方法獲取Brand標(biāo)簽列表
- 獲得Brand值為“華為”的標(biāo)簽對(duì)象
- 通過(guò)getParentNode()方法獲得父節(jié)點(diǎn)對(duì)象
- 調(diào)用父節(jié)點(diǎn)的removeChild()方法刪除節(jié)點(diǎn)
<?xml version="1.0" encoding="GB2312"?> <PhoneInfo> <Brand name="華為"> <Type name="U8650"/> <Type name="HW123"/> <Type name="HW321"/> </Brand> <Brand name="蘋果"> <Type name="iPhone4"/> </Brand> <Brand name="三星"> <Type name="Note4"/> </Brand> </PhoneInfo>
package com.hsh.exercise4; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; public class Main { public static void main(String[] args) throws Exception { // 創(chuàng)建解析器工廠對(duì)象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder db = factory.newDocumentBuilder(); Document document = db.parse("./src/com/hsh/exercise4/收藏信息.xml"); // 獲取根元素 Element root = document.getDocumentElement(); System.out.println(root.getNodeName()); // 獲取root所有Brand子級(jí)標(biāo)簽 NodeList nodeList = root.getElementsByTagName("Brand"); for (int i = 0; i < nodeList.getLength(); i++) { // 給每一個(gè)Brand標(biāo)簽加屬性 Element brand = (Element) nodeList.item(i); brand.setAttribute("id", (i+1)+""); } // 遍歷子級(jí)標(biāo)簽刪除 Brand的屬性為華為的標(biāo)簽 for (int i = 0; i < nodeList.getLength(); i++) { Element brand = (Element) nodeList.item(i); if (brand.getAttribute("name").equals("華為")) { // 得到父元素 Element parent = (Element) brand.getParentNode(); // 刪除 parent.removeChild(brand); } } // 創(chuàng)建工廠進(jìn)行保存 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); // 設(shè)置格式化 // 縮進(jìn) transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 指定輸出 transformer.setOutputProperty(OutputKeys.METHOD, "xml"); // 指定編碼 transformer.setOutputProperty(OutputKeys.ENCODING, "GB2312"); DOMSource domSource = new DOMSource(document); StreamResult streamResult = new StreamResult("./src/com/hsh/exercise4/收藏信息.xml"); transformer.transform(domSource, streamResult); System.out.println("保存成功"); } }
結(jié)果如下。
<?xml version="1.0" encoding="GB2312" standalone="no"?> <PhoneInfo> <Brand id="2" name="蘋果"> <Type name="iPhone4"/> </Brand> <Brand id="3" name="三星"> <Type name="Note4"/> </Brand> </PhoneInfo>
SAX
基于事件的解析
適用于大數(shù)據(jù)量的XML文檔
特點(diǎn):占用資源少,內(nèi)存消耗小
DOM4J
優(yōu)點(diǎn)
- 非常優(yōu)秀的Java XML API
- 性能優(yōu)異、功能強(qiáng)大
開放源代碼
- Document:定義XML文檔
- Element:定義XML元素
- Text:定義XML文本節(jié)點(diǎn)
- Attribute:定義了XML 的屬性
DOM4J下載和導(dǎo)入項(xiàng)目
1、下載相關(guān)jar包
方法一:去DOM4j官網(wǎng)
2、將下載的jar包導(dǎo)入到idea項(xiàng)目中去
3、將jar包添加到庫(kù)中
點(diǎn)擊確定,打開lib出現(xiàn)如下界面就說(shuō)明添加成功。
DOM4j代碼編寫
獲取所有值
解析器的構(gòu)造方法
構(gòu)造方法 | 說(shuō)明 |
---|---|
public SAXReader() | xml解析器對(duì)象 |
解析器對(duì)象中的方法
方法 | 說(shuō)明 |
---|---|
public Document read(String systemId) | 讀取Xml文件 |
Document類中的方法
方法 | 說(shuō)明 |
---|---|
Element getRootElement(); | 獲取根元素對(duì)象 |
public String getName() | 獲取元素標(biāo)簽名 |
public String attributeValue(QName qName) | 獲取元素的屬性名 |
public String getText() | 獲取元素的內(nèi)容 |
public List<Element> elements() | 獲取所有一級(jí)子標(biāo)簽 |
public List elements(String name) | 獲取所有一級(jí)子標(biāo)簽中的指定標(biāo)簽 |
public Element element(String name) | 獲取一級(jí)子標(biāo)簽中的指定標(biāo)簽,若該標(biāo)簽有多個(gè)則獲取第一個(gè) |
<?xml version="1.0" encoding="GB2312"?> <PhoneInfo> <Brand name="華為"> <Type name="U8650"/> <Type name="HW123"/> <Type name="HW321"/> </Brand> <Brand name="蘋果"> <Type name="iPhone4"/> </Brand> </PhoneInfo>
package com.hsh.exercise5; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import java.util.List; public class Main { public static void main(String[] args) throws Exception { //創(chuàng)建一個(gè)dom4j提供的解析器對(duì)象 SAXReader saxReader = new SAXReader(); //將xml文件讀取到我們的內(nèi)存當(dāng)中,獲取到這個(gè)Document 對(duì)象之后就可以讀取里面的數(shù)據(jù)了 Document document = saxReader.read("./src/com/hsh/exercise5/收藏信息.xml"); System.out.println("---獲取根元素---"); //1、獲取根元素對(duì)象里面的所有信息,下面根據(jù)這個(gè)根元素對(duì)象去獲取想要的數(shù)據(jù) Element rootElement = document.getRootElement(); System.out.println(rootElement.getName());// PhoneInfo System.out.println("---獲取所有一級(jí)子標(biāo)簽---"); //2、獲取根元素里面的一級(jí)子元素 List<Element> elements = rootElement.elements(); for (Element element : elements){ // 獲取標(biāo)簽名 System.out.println(element.getName()); // 獲取屬性值 System.out.println(element.attributeValue("name")); // 獲取標(biāo)簽內(nèi)容 這是空,因?yàn)闆]有設(shè)置內(nèi)容。 System.out.println(element.getText()); } // Brand // 華為 // Brand // 蘋果 System.out.println("---獲取所有一級(jí)子標(biāo)簽中的指定標(biāo)簽---"); //獲取節(jié)點(diǎn)名稱為books下所有子節(jié)點(diǎn) List<Element> Elist = rootElement.elements("Brand"); for (Element element : Elist){ System.out.println(element.getName()); } // Brand // Brand System.out.println("---獲取一級(jí)子標(biāo)簽中的指定標(biāo)簽---"); // 如果重復(fù),則獲取第一個(gè) Element element = rootElement.element("Brand"); System.out.println(element.getName());// Brand } }
修改值和刪除值
方法 | 說(shuō)明 |
---|---|
public Node detach() | 刪除dom元素(標(biāo)簽) |
public void setAttributeValue(String name, String value) | 修改屬性值 |
原文件
<?xml version="1.0" encoding="GB2312"?> <PhoneInfo> <Brand name="華為"> <Type name="U8650"/> <Type name="HW123"/> <Type name="HW321"/> </Brand> <Brand name="蘋果"> <Type name="iPhone4"/> </Brand> </PhoneInfo>
修改
package com.hsh.exercise5; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import java.io.FileWriter; import java.util.List; public class DelUpdXml { public static void main(String[] args) throws Exception { //創(chuàng)建一個(gè)dom4j提供的解析器對(duì)象 SAXReader saxReader = new SAXReader(); //將xml文件讀取到我們的內(nèi)存當(dāng)中,獲取到這個(gè)Document 對(duì)象之后就可以讀取里面的數(shù)據(jù)了 Document document = saxReader.read("./src/com/hsh/exercise5/收藏信息.xml"); // 獲取根元素對(duì)象 Element rootElement = document.getRootElement(); System.out.println(rootElement.getName()); // 獲取所有一級(jí)子標(biāo)簽 List<Element> elements = rootElement.elements(); for (int i = 0; i < elements.size(); i++){ if(elements.get(i).attributeValue("name").equals("蘋果")){ // 刪除 elements.get(i).detach(); }else { // 修改 elements.get(i).setAttributeValue("name", "華為手機(jī)"); } } // 設(shè)置XML文件的格式 OutputFormat outputFormat = OutputFormat.createPrettyPrint(); outputFormat.setEncoding("GB2312"); // 設(shè)置編碼格式 // 寫入XML文件的位置 以及指定的格式 XMLWriter xmlWriter=new XMLWriter(new FileWriter("./src/com/hsh/exercise5/exercise.xml"),outputFormat); // 開始寫入XML文件 寫入Document對(duì)象 xmlWriter.write(document); xmlWriter.close(); } }
結(jié)果
<?xml version="1.0" encoding="GB2312"?> <PhoneInfo> <Brand name="華為手機(jī)"> <Type name="U8650"/> <Type name="HW123"/> <Type name="HW321"/> </Brand> </PhoneInfo>
添加值并保存文件
添加相關(guān)方法
方法 | 說(shuō)明 |
---|---|
public static Element createElement(String name) | 創(chuàng)建元素(標(biāo)簽) |
Element addAttribute(String var1, String var2); | 設(shè)置元素的屬性 |
public void add(Element element) | 添加元素()中是傳入的子元素 |
保存文件相關(guān)方法
方法 | 說(shuō)明 |
---|---|
public static OutputFormat createPrettyPrint() | 創(chuàng)建xml格式 |
public XMLWriter(Writer writer, OutputFormat format) | 參數(shù)分別是java的輸出流和創(chuàng)建xml格式 |
public void write(Document doc) | 寫入Document對(duì)象 |
public void close() | 關(guān)閉流 |
package com.hsh.exercise5; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import java.io.FileWriter; public class WriteXML { public static void main(String[] args) throws Exception { // 創(chuàng)建根元素對(duì)象 Element rootElement = DocumentHelper.createElement("PhoneInfo"); // 創(chuàng)建子元素 Element Brand = DocumentHelper.createElement("Brand"); Brand.addAttribute("name","華為"); Element Type = DocumentHelper.createElement("Type"); // 設(shè)置子元素的屬性 Type.addAttribute("name","P10"); Brand.add(Type); rootElement.add(Brand); // 創(chuàng)建Document對(duì)象 Document document = DocumentHelper.createDocument(rootElement); // 設(shè)置XML文件的格式 OutputFormat outputFormat = OutputFormat.createPrettyPrint(); outputFormat.setEncoding("GB2312"); // 設(shè)置編碼格式 // 寫入XML文件的位置 以及指定的格式 XMLWriter xmlWriter=new XMLWriter(new FileWriter("./src/com/hsh/exercise5/exercise.xml"),outputFormat); // 開始寫入XML文件 寫入Document對(duì)象 xmlWriter.write(document); xmlWriter.close(); } }
// 輸出結(jié)果
<?xml version="1.0" encoding="GB2312"?> <PhoneInfo> <Brand name="華為"> <Type name="P10"/> </Brand> </PhoneInfo>
案例:使用DOM4J解析XML文件
- 顯示手機(jī)收藏信息
- 保存手機(jī)收藏信息
- 為手機(jī)收藏信息添加新的節(jié)點(diǎn)
- 修改/刪除手機(jī)收藏信息節(jié)點(diǎn)
package com.hsh.exercise5; public class Test { public static void main(String[] args) throws Exception { XmlServise xmlServise = new XmlServise("./src/com/hsh/exercise5/收藏信息.xml"); xmlServise.addElemnet("小米","小米15"); xmlServise.addElemnet("小米","小米14"); xmlServise.addElemnet("三星","酸14"); xmlServise.addElemnet("三星","三星14"); xmlServise.addElemnet("三星","小米14"); xmlServise.delType("三星","小米14"); xmlServise.delBrand("三星"); xmlServise.updateType("小米","小米14","小米13"); xmlServise.updateBrand("小米","三星"); xmlServise.updateBrand("三星","小米"); xmlServise.save(); xmlServise.print(); } }
package com.hsh.exercise5; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import java.io.FileWriter; import java.util.List; public class XmlServise { public Document document; public String url; SAXReader saxReader = new SAXReader(); public XmlServise(String url) throws Exception { this.url = url; this.document =saxReader.read(url); } public void print(){ // 獲取根節(jié)點(diǎn) Element rootElement = document.getRootElement(); // 獲取根節(jié)點(diǎn)的所有子標(biāo)簽 List<Element> elements = rootElement.elements(); for (int i = 0; i < elements.size(); i++){ System.out.print("手機(jī)品牌:"); // 獲取屬性值 System.out.print(elements.get(i).attributeValue("name")+","); System.out.print("手機(jī)型號(hào):"); for (int j = 0; j < elements.get(i).elements().size(); j++){ // 獲取屬性 System.out.print(elements.get(i).elements().get(j).attributeValue("name")+" "); } System.out.println(); } } public void save() throws Exception { // 設(shè)置XML文件的格式 OutputFormat outputFormat = OutputFormat.createPrettyPrint(); outputFormat.setEncoding("UTF-8"); XMLWriter xmlWriter=new XMLWriter(new FileWriter(url),outputFormat); xmlWriter.write(document); xmlWriter.close(); } public void addElemnet(String brand, String type) throws Exception{ // 獲取根節(jié)點(diǎn) Element rootElement = document.getRootElement(); boolean isBrandExist = false; boolean isTypeExist = false; // 遍歷查找是否有brand的name屬性的名字相同的 List<Element> elements = rootElement.elements(); for (int i = 0; i < elements.size(); i++){ if(elements.get(i).attributeValue("name").equals(brand)){ isBrandExist = true; List<Element> elements1 = elements.get(i).elements(); for (int j = 0; j < elements1.size(); j++){ if(elements1.get(j).attributeValue("name").equals(type)){ isTypeExist = true; } } } } if(isBrandExist){ if(isTypeExist){ // 不添加 }else { // 遍歷找到該品牌并添加 for (int i = 0; i < elements.size(); i++){ if(elements.get(i).attributeValue("name").equals(brand)){ Element element = DocumentHelper.createElement("type"); element.addAttribute("name",type); elements.get(i).add(element); } } } }else { Element element = DocumentHelper.createElement("brand"); element.addAttribute("name",brand); Element element1 = DocumentHelper.createElement("type"); element1.addAttribute("name",type); element.add(element1); rootElement.add(element); } } public void delType(String brand, String type) { // 獲取根節(jié)點(diǎn) Element rootElement = document.getRootElement(); for (int i = 0; i < rootElement.elements().size(); i++){ if(rootElement.elements().get(i).attributeValue("name").equals(brand)){ for (int j = 0; j < rootElement.elements().get(i).elements().size(); j++){ if(rootElement.elements().get(i).elements().get(j).attributeValue("name").equals(type)){ rootElement.elements().get(i).elements().remove(j); } } } } } public void delBrand(String brand) { // 獲取根節(jié)點(diǎn) Element rootElement = document.getRootElement(); for (int i = 0; i < rootElement.elements().size(); i++){ if(rootElement.elements().get(i).attributeValue("name").equals(brand)){ rootElement.elements().remove(i); } } } public void updateType(String brand, String name, String newName) { // 獲取根節(jié)點(diǎn) Element rootElement = document.getRootElement(); for (int i = 0; i < rootElement.elements().size(); i++){ if(rootElement.elements().get(i).attributeValue("name").equals(brand)){ for (int j = 0; j < rootElement.elements().get(i).elements().size(); j++){ if(rootElement.elements().get(i).elements().get(j).attributeValue("name").equals(name)){ rootElement.elements().get(i).elements().get(j).addAttribute("name",newName); } } } } } public void updateBrand(String brand, String newBrand) { // 獲取根節(jié)點(diǎn) Element rootElement = document.getRootElement(); for (int i = 0; i < rootElement.elements().size(); i++){ if(rootElement.elements().get(i).attributeValue("name").equals(brand)){ rootElement.elements().get(i).addAttribute("name",newBrand); } } } }
結(jié)果
<?xml version="1.0" encoding="UTF-8"?> <PhoneInfo> <Brand name="華為"> <Type name="U8650"/> <Type name="HW123"/> <Type name="HW321"/> </Brand> <Brand name="蘋果"> <Type name="iPhone4"/> </Brand> <brand name="小米"> <type name="小米15"/> <type name="小米13"/> </brand> </PhoneInfo>
綜合案例
<?xml version="1.0" encoding="GBK"?> <citys> <city id='010'> <cityname>北京</cityname> <cityarea>華北</cityarea> <population>2114.8萬(wàn)人</population> </city> <city id='021'> <cityname>上海</cityname> <cityarea>華東</cityarea> <population>2,500萬(wàn)人</population> </city> <city id='020'> <cityname>廣州</cityname> <cityarea>華南</cityarea> <population>1292.68萬(wàn)人</population> </city> <city id='028'> <cityname>成都</cityname> <cityarea>華西</cityarea> <population>1417萬(wàn)人</population> </city> </citys>
(1)使用dom4j將信息存入xml中
(2)讀取信息,并打印控制臺(tái)
(3)添加一個(gè)city節(jié)點(diǎn)與子節(jié)點(diǎn)
(4)使用socket TCP協(xié)議編寫服務(wù)端與客戶端,客戶端輸入城市ID,服務(wù)器響應(yīng)相應(yīng)城市信息
(5)使用socket TCP協(xié)議編寫服務(wù)端與客戶端,客戶端要求用戶輸入city對(duì)象,服務(wù)端接收并使用dom4j保存至XML文件
解析
這道題我的思路是
將客戶端和服務(wù)端抽象成類,都有接收和發(fā)送功能。
然后把xml文件的添加,保存,查詢都給保存起來(lái)。
citys.xml
<?xml version="1.0" encoding="UTF-8"?> <citys> <city id="010"> <cityname>北京</cityname> <cityarea>華北</cityarea> <population>2114.8萬(wàn)人</population> </city> <city id="021"> <cityname>上海</cityname> <cityarea>華東</cityarea> <population>2,500萬(wàn)人</population> </city> <city id="020"> <cityname>廣州</cityname> <cityarea>華南</cityarea> <population>1292.68萬(wàn)人</population> </city> <city id="028"> <cityname>成都</cityname> <cityarea>華西</cityarea> <population>1417萬(wàn)人</population> </city> </citys>
Server.java
package com.hsh.homework1; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public int port; ServerSocket s; Socket socket; OutputStream os; InputStream is; public Server(int port) { this.port = port; } public void start() throws Exception { System.out.println("服務(wù)器啟動(dòng)成功"); s = new ServerSocket(port); // 每使用一次 accept 說(shuō)明一個(gè)客戶端連接 // 再次使用就和上一次的客戶端連接斷開 socket = s.accept(); // 只 accept 一次 is = socket.getInputStream(); os = socket.getOutputStream(); System.out.println("客戶端已連接"); } public void stop() throws Exception { s.close(); } /** * 發(fā)送消息 比如返回該城市的信息 * @param msg * @throws Exception */ public void responseMsg(String msg) throws Exception { System.out.println("服務(wù)器開始發(fā)送"); os.write((msg+"END").getBytes()); System.out.println("服務(wù)器發(fā)送成功"); } /** * 接收指令 * @return * @throws Exception */ public String receiveMsg() throws Exception { System.out.println("服務(wù)器開始接收"); byte[] b = new byte[1024]; int len; String str = ""; boolean receivedEnd = false; while (!receivedEnd && (len = is.read(b)) != -1) { str += new String(b, 0, len); if (str.contains("END")) { str = str.replace("END", ""); // 去掉結(jié)束符 receivedEnd = true; } } return str; } }
ServerTest.java
package com.hsh.homework1; public class ServerTest { public static void main(String[] args) throws Exception { Server server = new Server(9999); server.start(); XmlServise xmlServise = new XmlServise("src/com/hsh/homework1/citys.xml"); while (true) { String msg = server.receiveMsg(); System.out.println("收到客戶端指令: " + msg); switch (msg){ case "1": // 接收要查詢的省份id String provinceId = server.receiveMsg(); System.out.println("查詢省份id: " + provinceId); String cityInfo = xmlServise.getCityInfo(provinceId); server.responseMsg(cityInfo); System.out.println(); break; case "2": String addCityInfo =server.receiveMsg(); System.out.println("添加城市信息: " + addCityInfo); String[] arr = Utils.split(addCityInfo); xmlServise.addCity(arr[0], arr[1], arr[2], arr[3]); xmlServise.save(); break; default: server.responseMsg("無(wú)效指令"); break; } } } }
Client.java
package com.hsh.homework1; import java.io.OutputStream; import java.lang.reflect.Array; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class Client { String url; int port; Socket socket; OutputStream os; public Client(String url, int port) { this.url = url; this.port = port; } public void start() throws Exception { socket = new Socket(url, port); System.out.println("客戶端啟動(dòng)成功"); } /** * 接收消息 * @return * @throws Exception */ public String receiveMsg() throws Exception { System.out.println("客戶端開始接收"); socket.getInputStream(); byte[] b = new byte[1024]; int len; String str = ""; // 循環(huán)讀取,直到讀取到結(jié)束符,不然可能會(huì)卡在這不往下走。 boolean receivedEnd = false; while (!receivedEnd && (len = socket.getInputStream().read(b)) != -1) { str += new String(b, 0, len); if (str.contains("END")) { str = str.replace("END", ""); // 去掉結(jié)束符 receivedEnd = true; } } System.out.println("客戶端接收成功"); return str; } /** * 關(guān)閉 * * @throws Exception */ public void stop() throws Exception { os.close(); socket.close(); } /** * 發(fā)送消息 * * @param instructions * @throws Exception */ public void sendInstructions(String instructions) throws Exception { System.out.println("客戶端開始發(fā)送"); os = socket.getOutputStream(); os.write((instructions + "END").getBytes()); System.out.println("客戶端發(fā)送成功"); } }
ClientTest.java
package com.hsh.homework1; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class ClientTest { public static void main(String[] args) throws Exception { Client client = new Client("127.0.0.1", 9999); client.start(); Scanner sc = new Scanner(System.in); while (true){ System.out.println("請(qǐng)選擇操作"); System.out.println("1.輸入城市ID查看城市信息"); System.out.println("2.輸入城市id,省份,省份歸屬地,人口數(shù)"); System.out.println("3.退出"); switch (sc.next()){ case "1": client.sendInstructions("1"); System.out.println("請(qǐng)輸入城市ID"); // client.sendID(sc.next()); client.sendInstructions(sc.next()); System.out.println(client.receiveMsg()); break; case "2": client.sendInstructions("2"); System.out.println("請(qǐng)輸入城市ID"); String id =sc.next(); System.out.println("請(qǐng)輸入省份"); String province =sc.next(); System.out.println("請(qǐng)輸入省份歸屬地"); String area =sc.next(); System.out.println("請(qǐng)輸入人口數(shù)"); String population =sc.next(); List<String> list = new ArrayList<>(); list.add(id); list.add(province); list.add(area); list.add(population); client.sendInstructions(list.toString()); // client.sendCityInfo(id,province,area,population); break; case "3": System.out.println("退出"); client.stop(); return; default: System.out.println("請(qǐng)輸入正確的選項(xiàng)"); break; } } } }
XmlServise.java
? package com.hsh.homework1; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import java.io.FileWriter; public class XmlServise { public Document document; public String url; SAXReader saxReader = new SAXReader(); public XmlServise(String url) throws Exception { this.url = url; this.document =saxReader.read(url); } public String printXml() { // 直接輸出xml內(nèi)容 return document.asXML(); } public void print() { // 直接輸出xml內(nèi)容 // System.out.println(document.asXML()); // System.out.println(); Element rootElement = document.getRootElement(); for (int i = 0; i < rootElement.elements().size(); i++){ Element element = rootElement.elements().get(i); System.out.println(element.attributeValue("id")); for (int j = 0; j < element.elements().size(); j++){ Element element1 = element.elements().get(j); System.out.println(" "+element1.getText()); } } } public void addCity(String number, String cityname, String cityarea, String population) { Element rootElement = document.getRootElement(); // 創(chuàng)建city元素 Element city = DocumentHelper.createElement("city"); city.addAttribute("id",number); // 創(chuàng)建cityname元素 Element citynameElement = DocumentHelper.createElement("cityname"); citynameElement.setText(cityname); // 創(chuàng)建cityarea元素 Element cityareaElement = DocumentHelper.createElement("cityarea"); cityareaElement.setText(cityarea); // 創(chuàng)建population元素 Element populationElement = DocumentHelper.createElement("population"); populationElement.setText(population); city.add(citynameElement); city.add(cityareaElement); city.add(populationElement); rootElement.add(city); } /** * 獲取城市信息 * @param provinceId * @return */ public String getCityInfo(String provinceId) { Element rootElement = document.getRootElement(); for (int i = 0; i < rootElement.elements().size(); i++){ Element element = rootElement.elements().get(i); if(element.attributeValue("id").equals(provinceId)){ StringBuilder stringBuilder = new StringBuilder(); for (int j = 0; j < element.elements().size(); j++){ Element element1 = element.elements().get(j); stringBuilder.append(element1.getText()); stringBuilder.append(" "); } return stringBuilder.toString(); } } return "沒有此城市"; } public void save() throws Exception{ OutputFormat outputFormat = OutputFormat.createPrettyPrint(); outputFormat.setEncoding("UTF-8"); XMLWriter xmlWriter=new XMLWriter(new FileWriter(url),outputFormat); xmlWriter.write(document); xmlWriter.close(); } } ?
Utils.java
package com.hsh.homework1; public class Utils { public static String[] split(String str) { String[] arr = str.substring(1, str.length() - 1).split(","); for (int i = 0; i < arr.length; i++) { arr[i] = arr[i].trim(); System.out.println(arr[i]); } return arr; } }
運(yùn)行結(jié)果
客戶端啟動(dòng)成功
請(qǐng)選擇操作
1.輸入城市ID查看城市信息
2.輸入城市id,省份,省份歸屬地,人口數(shù)
3.退出
1
客戶端開始發(fā)送
客戶端發(fā)送成功
請(qǐng)輸入城市ID
010
客戶端開始發(fā)送
客戶端發(fā)送成功
客戶端開始接收
客戶端接收成功
北京 華北 2114.8萬(wàn)人請(qǐng)選擇操作
1.輸入城市ID查看城市信息
2.輸入城市id,省份,省份歸屬地,人口數(shù)
3.退出
2
客戶端開始發(fā)送
客戶端發(fā)送成功
請(qǐng)輸入城市ID
035
請(qǐng)輸入省份
河南
請(qǐng)輸入省份歸屬地
華中
請(qǐng)輸入人口數(shù)
1234萬(wàn)人
客戶端開始發(fā)送
客戶端發(fā)送成功請(qǐng)選擇操作
1.輸入城市ID查看城市信息
2.輸入城市id,省份,省份歸屬地,人口數(shù)
3.退出
1
客戶端開始發(fā)送
客戶端發(fā)送成功
請(qǐng)輸入城市ID
035
客戶端開始發(fā)送
客戶端發(fā)送成功
客戶端開始接收
客戶端接收成功
河南 華中 1234萬(wàn)人請(qǐng)選擇操作
1.輸入城市ID查看城市信息
2.輸入城市id,省份,省份歸屬地,人口數(shù)
3.退出
服務(wù)器啟動(dòng)成功
客戶端已連接
服務(wù)器開始接收
收到客戶端指令: 1
服務(wù)器開始接收
查詢省份id: 010
服務(wù)器開始發(fā)送
服務(wù)器發(fā)送成功服務(wù)器開始接收
收到客戶端指令: 2
服務(wù)器開始接收
添加城市信息: [035, 河南, 華中, 1234萬(wàn)人]
035
河南
華中
1234萬(wàn)人
服務(wù)器開始接收
收到客戶端指令: 1
服務(wù)器開始接收
查詢省份id: 035
服務(wù)器開始發(fā)送
服務(wù)器發(fā)送成功服務(wù)器開始接收
<?xml version="1.0" encoding="UTF-8"?> <citys> <city id="010"> <cityname>北京</cityname> <cityarea>華北</cityarea> <population>2114.8萬(wàn)人</population> </city> <city id="021"> <cityname>上海</cityname> <cityarea>華東</cityarea> <population>2,500萬(wàn)人</population> </city> <city id="020"> <cityname>廣州</cityname> <cityarea>華南</cityarea> <population>1292.68萬(wàn)人</population> </city> <city id="028"> <cityname>成都</cityname> <cityarea>華西</cityarea> <population>1417萬(wàn)人</population> </city> <city id="035"> <cityname>河南</cityname> <cityarea>華中</cityarea> <population>1234萬(wàn)人</population> </city> </citys>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析
這篇文章主要介紹了Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07簡(jiǎn)單介紹Java?方法的重載、可變參數(shù)、作用域
這篇文章主要簡(jiǎn)單介紹Java?方法的重載、可變參數(shù)、作用域的相關(guān)資料,需要的朋友可以參考下2023-07-07