java中XML的使用

文章目錄

    • 什么是XML
    • 特點
    • XML作用
    • XML的編寫語法
      • 基本語法
      • 特殊字符編寫
    • 約束XML的書寫格式
      • DTD文檔
      • schema文檔
        • 屬性命名空間
        • XML命名空間的作用
    • 解析XML的方法
      • ??DOM解析XML
        • DOM介紹
        • DOM解析包:org.w3c.dom
        • 常用接口
        • DOM解析包的使用
        • 保存XML文件
        • 添加DOM節點
        • 修改/刪除DOM節點
      • SAX
      • DOM4J
        • 優點
        • DOM4J下載和導入項目
        • DOM4j代碼編寫
          • 獲取所有值
          • 修改值和刪除值
          • 添加值并保存文件
    • 綜合案例
      • 解析
      • citys.xml
      • Server.java
      • ServerTest.java
      • Client.java
      • ClientTest.java
      • XmlServise.java
      • Utils.java
      • 運行結果

什么是XML

XML(EXtensible Markup Language),可擴展標記語言,是一種簡單的基于文本的語言,旨在以村文本格式存儲和傳輸數據,他代表可擴展標記語言。
1、作為系統的配置文件
2、作為一種特殊的數據結構,在網絡中進行傳輸

特點

XML與操作系統、編程語言的開發平臺無關
實現不同系統之間的數據交換

XML作用

  1. 數據交互
  2. 配置應用程序和網站
  3. Ajax基石

XML的編寫語法

基本語法

所有XML元素都必須有結束標簽
XML標簽對大小寫敏感
XML必須正確的嵌套
同級標簽以縮進對齊
元素名稱可以包含字母、數字或其他的字符
元素名稱不能以數字或者標點符號開始
元素名稱中不能含空格

<?xml version="1.0" encoding="UTF-8"?>
<books><!--圖書信息  這是注釋--><book id="bk101"><author>王珊</author><title>.NET高級編程</title><description>包含C#框架和網絡編程等</description></book><book id="bk102"><author>李明明</author><title>XML基礎編程</title><description>包含XML基礎概念和基本作用</description></book>
</books>

注意一:<?xml version="1.0" encoding="utf-8" ?>這行是必須要寫的,且必須放在首行(前面有注釋都不行)。表示版本為1.0,以utf-8字符集來編碼
注意二:根標簽只能有一個,子標簽可以有多個
注意三:標簽是成對存在的,記得嵌套正確

XML文件可以在瀏覽器中查看,我們打開瀏覽器看到,我們寫的特殊字符的格式是我們所預期的
在這里插入圖片描述
在這里插入圖片描述

特殊字符編寫

1、 指定字符替代特殊字符
XML中書寫”<’
“&”等,可能會出現沖突,導致報錯,此時可以用如下特殊字符替代。

指定字符特殊字符含義
&lt;<小于
&gt;>大于
&amp;&小于
&apos;單引號
&quot;"雙引號

2、CDATA的數據區
XML中可以寫一個叫CDATA的數據區:<![CDATA[..內容... ]]>,里面的內容可以隨便寫

<Users><user id="1"><name>張三</name><age>18</age><address>廣州</address></user><userAttribute>都是愛學習的人</userAttribute><user id="2"><name>李四</name><age>25</age><address>哈爾濱</address></user><!--以下是帶有大于號小于號等特殊字符的寫法--><special><![CDATA[5 > 2 && 3 < 5]]></special><!--特殊字符用法二--><special>  5 &gt; 2 &amp;&amp; 3 &lt; 5 </special>
</Users>

在這里插入圖片描述

約束XML的書寫格式

DTD文檔

特點
可以約束XML文件的編寫
不能約束具體的數據類型

DTD文檔的使用
①:編寫DTD約束文檔,后綴必須是.dtd
data.dtd
根目錄只能叫做書并且可以有多個書的子元素
書只能由書名作者售價構成

<!ELEMENT 書架 (書+)>
<!ELEMENT 書 (書名,作者,售價)>
<!ELEMENT 書名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售價 (#PCDATA)>

②:在需要編寫的XML文件中導入該DTD約束文檔
<!DOCTYPE 書架 SYSTEM "data.dtd">
③:然后XML文件,就必須按照DTD約束文檔指定的格式進行編寫,否則報錯

<?xml version="1.0" encoding="UTF-8"?>
<!-- 導入約束格式 -->
<!DOCTYPE 書架 SYSTEM "data.dtd">
<書架><!-- 只能這么寫否則報錯 --><><書名>哈利波特</書名><作者>J.K.羅琳</作者><!-- 售價的類型可以是浮點型,字符串,也可以是任何數據類型 --><售價>49.9</售價></><><書名>西游記</書名><作者>吳承恩</作者><售價>49.9</售價></>
</書架>

schema文檔

特點
可以約束XML文件的編寫
可以約束具體的數據類型

schema文檔的使用
1、編寫schema約束文檔,后綴必須是.xsd,具體的形式到代碼中觀看。
2、在需要編寫的XML文件中導入該schema約束文檔
3、按照約束內容編寫XML文件的標簽

<?xml version="1.0" encoding="UTF-8"?>
<!-- xmlns: 核心命名空間聲明 -->
<!-- xmlns="http://www.w3.org/2001/XMLSchema:
聲明使用W3C XML Schema規范作為默認命名空間,所有未加前綴的標簽均屬于該規范。 -->
<!-- targetNamespace(目標命名空間): 申明約束文檔的地址(命名空間) 這里的data.xsd也是被約束的 -->
<!-- elementFormDefault(元素命名空間規則): 先不用管,這是關于局部元素的命名空間歸屬的屬性-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.itcast.cn"elementFormDefault="qualified" >
<!--全局元素定義,作為根元素,該元素直接屬于targetNamespace命名空間--><element name="書架"><complexType><!-- maxOccurs="unbounded" 書架下的子元素可以有無窮多個 --><sequence maxOccurs="unbounded"><element name=""><!--  寫子元素  --><complexType><sequence><element name="書名" type="string"/><element name="作者" type="string"/><element name="價格" 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><!-- 下面這個命名空間屬于xmlns:tea="http://www.Aptech_edu.ac" --><batch type="thirdbatch">第三批次</batch><!-- 下面這個命名空間屬于xmlns:tea="http://www.tea.org" --><batch tea:type="thirdbatch">第三批茶</batch><!-- 下面這個命名空間屬于xmlns:tea="http://www.Aptech_edu.ac" --><batch>午班批次</batch></batch-list>
</batchCompany>

除非帶有前綴,否則屬性屬于所屬的元素的命名空間

XML命名空間的作用

解決在復雜、大型XML文件中,出現名稱相同,但是含義不同的元素

<?xml version="1.0" encoding="UTF-8"?><!-- 兩個廠家(佳能相機和尼康相機)的地址 -->
<cameras xmlns:canon="http://www.canon"xmlns:nikon="http://www.nikon.com"><!-- 雖然都是相機camera  但是第一個是canon(佳能牌)的相機 第二個是nikon(尼康牌)的相機 --><canon:camera prodID="P663" name="Camera傻瓜相機"/><nikon:camera prodID=“K29B3” name=“Camera超級35毫米相機"/>
</cameras>

解析XML的方法

本節分三塊

DOM(內置解析XML)

  1. 基于XML文檔樹結構的解析
  2. 適用于多次訪問的XML文檔
  3. 特點:比較消耗資源

SAX(內置解析XML)

  1. 基于事件的解析
  2. 適用于大數據量的XML文檔
  3. 特點:占用資源少,內存消耗小

DOM4J

  1. 非常優秀的Java XML API
  2. 性能優異、功能強大
  3. 開放源代碼

??DOM解析XML

基于XML文檔樹結構的解析
適用于多次訪問的XML文檔
特點:比較消耗資源

DOM介紹

文檔對象模型(Document Object Model)
DOM把XML文檔映射成一個倒掛的樹
在這里插入圖片描述

DOM解析包:org.w3c.dom

org.w3c.dom?? 是 Java 中用于處理 ??文檔對象模型(DOM)?? 的核心包,由 ??萬維網聯盟(W3C)?? 制定并維護。它是 W3C DOM 標準的 Java 語言綁定實現,主要用于解析、訪問和操作 XML/HTML 文檔的結構化內容。(jdk自帶的用于解析xml文件的API)

常用接口
常用接口常用方法說明
Document:表示整個 XML 文檔NodeList getElementsByTagName(String Tag)按文檔順序返回文檔中指定標記名稱的所有元素集合
Element createElement(String tagName)創建指定標記名稱的元素
Node:該文檔樹中的單個節點NodeList getChildNodes()獲取該元素的所有子節點,返回節點集合
Element:XML 文檔中的一個元素String getTagName()獲取元素名稱
DOM解析包的使用

DOM解析XML文件步驟

  1. 創建解析器工廠對象
  2. 解析器工廠對象創建解析器對象
  3. 解析器對象指定XML文件創建Document對象
  4. 以Document對象為起點操作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文件中收藏的手機品牌和型號

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 {// 創建解析器工廠對象DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 解析器工廠對象創建解析器對象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");// 遍歷每個 Brand 節點并打印 name 屬性for (int i = 0; i < brandList.getLength(); i++) {// 獲取 Brand 元素Element brand = (Element) brandList.item(i);// 獲取節點名稱System.out.print(brand.getNodeName()+":  ");// 獲取 name 屬性System.out.print(brand.getAttribute("name")+",");// 獲取節點文本內容  由于是單標簽所以為空。// 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);// 獲取節點名稱System.out.print(type.getNodeName()+":  ");// 獲取 name 屬性System.out.print(type.getAttribute("name")+" ");}System.out.println();}// 輸出結果// Brand:  華為,Type:  U8650 Type:  HW123 Type:  HW321 // Brand:  蘋果,Type:  iPhone4}
}
保存XML文件

步驟

  1. 獲得TransformerFactory對象
  2. 創建Transformer對象
  3. 創建DOMSource對象:包含XML信息
  4. 設置輸出屬性:編碼格式
  5. 創建StreamResult對象:包含保存文件的信息
  6. 將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. 創建工廠TransformerFactory對象TransformerFactory factory = TransformerFactory.newInstance();//2. 創建Transformer對象Transformer  transformer = factory.newTransformer();// 3. 創建Document對象來創建新的XML文件,給XML文件設置內容,并將DOM結構添加到DOMsource對象// 3.1 創建Document對象DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();DocumentBuilder  builder = documentFactory.newDocumentBuilder();Document document = builder.newDocument();// 3.2 創建XML結構(即給XML文件設置內容)// 創建根元素Element root = document.createElement("root");// 加入到document中document.appendChild(root);// 創建子元素Element child = document.createElement("child");// 設置屬性名和屬性值child.setAttribute("name", "hsh");// 設置元素內容child.appendChild(document.createTextNode("Text Content"));//加入根節點樹中root.appendChild(child);// 3.3 將文件添加到DOMsource對象中DOMSource source = new DOMSource(document);// 4. 給第二步 的Transformer對象設置輸出屬性// 4.1設置是否再XML中添加縮進transformer.setOutputProperty(OutputKeys.INDENT,"yes");// 4.2指定輸出方法transformer.setOutputProperty(OutputKeys.METHOD, "xml");// 4.3指定輸出文件編碼transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");// 5. 創建StreamResult對象,指定輸出文件 StreamResult對象包含了文件信息StreamResult result = new StreamResult("./src/com/hsh/exercise3/collection.xml");// 6. 將DOMsource對象和StreamResult對象作為參數傳遞給Transformer對象的transform方法進行保存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節點

添加手機收藏

  1. 添加新的Brand:三星
  2. 給Brand節點添加新的子標簽Type:Note4
  3. 將Brand添加到DOM樹中

練習:給手機收藏信息XML中添加新的手機信息,并將手機收藏信息保存到新文件中
添加新的Brand:三星
給Brand節點添加新的子標簽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 {// 創建解析器工廠對象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());// 給根元素添加子元素BrandElement brand = document.createElement("Brand");brand.setAttribute("name","三星");// 給Brand 元素添加子元素TypeElement type = document.createElement("Type");// 設置Type的屬性type.setAttribute("name","Note4");// 將Type添加到Brand中brand.appendChild(type);root.appendChild(brand);// 創建工廠進行保存TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();// 設置格式化// 縮進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節點
  1. 給所有的Brand標簽添加id屬性
    • 獲取Brand標簽
    • 調用setAttribute()方法添加屬性
  2. 刪除Brand值為“華為”的標簽
    • getElementsByTagName()方法獲取Brand標簽列表
    • 獲得Brand值為“華為”的標簽對象
    • 通過getParentNode()方法獲得父節點對象
    • 調用父節點的removeChild()方法刪除節點
<?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 {// 創建解析器工廠對象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子級標簽NodeList nodeList = root.getElementsByTagName("Brand");for (int i = 0; i < nodeList.getLength(); i++) {// 給每一個Brand標簽加屬性Element brand = (Element) nodeList.item(i);brand.setAttribute("id", (i+1)+"");}// 遍歷子級標簽刪除 Brand的屬性為華為的標簽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);}}// 創建工廠進行保存TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();// 設置格式化// 縮進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("保存成功");}
}

結果如下。

<?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

基于事件的解析
適用于大數據量的XML文檔
特點:占用資源少,內存消耗小

DOM4J

優點

非常優秀的Java XML API
性能優異、功能強大
開放源代碼

Document:定義XML文檔
Element:定義XML元素
Text:定義XML文本節點
Attribute:定義了XML 的屬性

DOM4J下載和導入項目

1、下載相關jar包
方法一:去DOM4j官網
在這里插入圖片描述

方法二:我的百度網盤提取
這官網有限制,有的同學訪問不了可以通過百度網盤獲取jar包。

通過網盤分享的文件:dom4j
鏈接: https://pan.baidu.com/s/1301CPh5h7yv1wa1ddvUqtQ?pwd=dsvj
提取碼: dsvj

2、將下載的jar包導入到idea項目中去
在這里插入圖片描述
在這里插入圖片描述

3、將jar包添加到庫中
在這里插入圖片描述
點擊確定,打開lib出現如下界面就說明添加成功。
在這里插入圖片描述

DOM4j代碼編寫
獲取所有值

解析器的構造方法

構造方法說明
public SAXReader()xml解析器對象

解析器對象中的方法

方法說明
public Document read(String systemId)讀取Xml文件

Document類中的方法

方法說明
Element getRootElement();獲取根元素對象
public String getName()獲取元素標簽名
public String attributeValue(QName qName)獲取元素的屬性名
public String getText()獲取元素的內容
public List<Element> elements()獲取所有一級子標簽
public List elements(String name)獲取所有一級子標簽中的指定標簽
public Element element(String name)獲取一級子標簽中的指定標簽,若該標簽有多個則獲取第一個
<?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 {
//創建一個dom4j提供的解析器對象SAXReader saxReader = new SAXReader();//將xml文件讀取到我們的內存當中,獲取到這個Document 對象之后就可以讀取里面的數據了Document document = saxReader.read("./src/com/hsh/exercise5/收藏信息.xml");System.out.println("---獲取根元素---");//1、獲取根元素對象里面的所有信息,下面根據這個根元素對象去獲取想要的數據Element rootElement = document.getRootElement();System.out.println(rootElement.getName());// PhoneInfoSystem.out.println("---獲取所有一級子標簽---");//2、獲取根元素里面的一級子元素List<Element> elements = rootElement.elements();for (Element element : elements){// 獲取標簽名System.out.println(element.getName());// 獲取屬性值System.out.println(element.attributeValue("name"));// 獲取標簽內容 這是空,因為沒有設置內容。System.out.println(element.getText());}// Brand// 華為// Brand// 蘋果System.out.println("---獲取所有一級子標簽中的指定標簽---");//獲取節點名稱為books下所有子節點List<Element> Elist = rootElement.elements("Brand");for (Element element : Elist){System.out.println(element.getName());}// Brand// BrandSystem.out.println("---獲取一級子標簽中的指定標簽---");// 如果重復,則獲取第一個Element element = rootElement.element("Brand");System.out.println(element.getName());// Brand}
}
修改值和刪除值
方法說明
public Node detach()刪除dom元素(標簽)
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 {//創建一個dom4j提供的解析器對象SAXReader saxReader = new SAXReader();//將xml文件讀取到我們的內存當中,獲取到這個Document 對象之后就可以讀取里面的數據了Document document = saxReader.read("./src/com/hsh/exercise5/收藏信息.xml");// 獲取根元素對象Element rootElement = document.getRootElement();System.out.println(rootElement.getName());// 獲取所有一級子標簽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", "華為手機");}}// 設置XML文件的格式OutputFormat outputFormat = OutputFormat.createPrettyPrint();outputFormat.setEncoding("GB2312");   // 設置編碼格式// 寫入XML文件的位置 以及指定的格式XMLWriter xmlWriter=new XMLWriter(new FileWriter("./src/com/hsh/exercise5/exercise.xml"),outputFormat);// 開始寫入XML文件   寫入Document對象xmlWriter.write(document);xmlWriter.close();}
}

結果

<?xml version="1.0" encoding="GB2312"?><PhoneInfo> <Brand name="華為手機"> <Type name="U8650"/>  <Type name="HW123"/>  <Type name="HW321"/> </Brand> 
</PhoneInfo>
添加值并保存文件

添加相關方法

方法說明
public static Element createElement(String name)創建元素(標簽)
Element addAttribute(String var1, String var2);設置元素的屬性
public void add(Element element)添加元素()中是傳入的子元素

保存文件相關方法

方法說明
public static OutputFormat createPrettyPrint()創建xml格式
public XMLWriter(Writer writer, OutputFormat format)參數分別是java的輸出流和創建xml格式
public void write(Document doc)寫入Document對象
public void close()關閉流
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 {// 創建根元素對象Element rootElement = DocumentHelper.createElement("PhoneInfo");// 創建子元素Element Brand = DocumentHelper.createElement("Brand");Brand.addAttribute("name","華為");Element Type  = DocumentHelper.createElement("Type");// 設置子元素的屬性Type.addAttribute("name","P10");Brand.add(Type);rootElement.add(Brand);// 創建Document對象Document document = DocumentHelper.createDocument(rootElement);// 設置XML文件的格式OutputFormat outputFormat = OutputFormat.createPrettyPrint();outputFormat.setEncoding("GB2312");   // 設置編碼格式// 寫入XML文件的位置 以及指定的格式XMLWriter xmlWriter=new XMLWriter(new FileWriter("./src/com/hsh/exercise5/exercise.xml"),outputFormat);// 開始寫入XML文件   寫入Document對象xmlWriter.write(document);xmlWriter.close();}
}

// 輸出結果

<?xml version="1.0" encoding="GB2312"?><PhoneInfo><Brand name="華為"><Type name="P10"/></Brand>
</PhoneInfo>

案例:使用DOM4J解析XML文件

  1. 顯示手機收藏信息
  2. 保存手機收藏信息
  3. 為手機收藏信息添加新的節點
  4. 修改/刪除手機收藏信息節點
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(){// 獲取根節點Element rootElement = document.getRootElement();// 獲取根節點的所有子標簽List<Element> elements = rootElement.elements();for (int i = 0; i < elements.size(); i++){System.out.print("手機品牌:");//  獲取屬性值System.out.print(elements.get(i).attributeValue("name")+",");System.out.print("手機型號:");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 {// 設置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{// 獲取根節點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) {// 獲取根節點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) {// 獲取根節點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) {// 獲取根節點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) {// 獲取根節點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);}}}
}

結果

<?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萬人</population></city><city id='021'><cityname>上海</cityname><cityarea>華東</cityarea><population>2,500萬人</population></city><city id='020'><cityname>廣州</cityname><cityarea>華南</cityarea><population>1292.68萬人</population></city><city id='028'><cityname>成都</cityname><cityarea>華西</cityarea><population>1417萬人</population></city>
</citys>

(1)使用dom4j將信息存入xml中
(2)讀取信息,并打印控制臺
(3)添加一個city節點與子節點
(4)使用socket TCP協議編寫服務端與客戶端,
客戶端輸入城市ID,服務器響應相應城市信息
(5)使用socket TCP協議編寫服務端與客戶端,客戶端要求用戶輸入city對象,服務端接收并使用dom4j保存至XML文件

請參考我的之前的博客 -----> java之網絡編程
—>java之IO流

解析

這道題我的思路是
將客戶端和服務端抽象成類,都有接收和發送功能。
然后把xml文件的添加,保存,查詢都給保存起來。

citys.xml

<?xml version="1.0" encoding="UTF-8"?>
<citys> <city id="010"> <cityname>北京</cityname>  <cityarea>華北</cityarea>  <population>2114.8萬人</population> </city>  <city id="021"> <cityname>上海</cityname>  <cityarea>華東</cityarea>  <population>2,500萬人</population> </city>  <city id="020"> <cityname>廣州</cityname>  <cityarea>華南</cityarea>  <population>1292.68萬人</population> </city>  <city id="028"> <cityname>成都</cityname>  <cityarea>華西</cityarea>  <population>1417萬人</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("服務器啟動成功");s = new ServerSocket(port);// 每使用一次 accept 說明一個客戶端連接// 再次使用就和上一次的客戶端連接斷開socket = s.accept(); // 只 accept 一次is = socket.getInputStream();os = socket.getOutputStream();System.out.println("客戶端已連接");}public void stop() throws Exception {s.close();}/*** 發送消息 比如返回該城市的信息* @param msg* @throws Exception*/public void responseMsg(String msg) throws Exception {System.out.println("服務器開始發送");os.write((msg+"END").getBytes());System.out.println("服務器發送成功");}/*** 接收指令* @return* @throws Exception*/public String receiveMsg() throws Exception {System.out.println("服務器開始接收");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", ""); // 去掉結束符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":// 接收要查詢的省份idString 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("無效指令");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("客戶端啟動成功");}/*** 接收消息* @return* @throws Exception*/public String receiveMsg() throws Exception {System.out.println("客戶端開始接收");socket.getInputStream();byte[] b = new byte[1024];int len;String str = "";// 循環讀取,直到讀取到結束符,不然可能會卡在這不往下走。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", ""); // 去掉結束符receivedEnd = true;}}System.out.println("客戶端接收成功");return str;}/*** 關閉** @throws Exception*/public void stop() throws Exception {os.close();socket.close();}/*** 發送消息** @param instructions* @throws Exception*/public void sendInstructions(String instructions) throws Exception {System.out.println("客戶端開始發送");os = socket.getOutputStream();os.write((instructions + "END").getBytes());System.out.println("客戶端發送成功");}
}

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("請選擇操作");System.out.println("1.輸入城市ID查看城市信息");System.out.println("2.輸入城市id,省份,省份歸屬地,人口數");System.out.println("3.退出");switch (sc.next()){case "1":client.sendInstructions("1");System.out.println("請輸入城市ID");
//                    client.sendID(sc.next());client.sendInstructions(sc.next());System.out.println(client.receiveMsg());break;case "2":client.sendInstructions("2");System.out.println("請輸入城市ID");String id =sc.next();System.out.println("請輸入省份");String province =sc.next();System.out.println("請輸入省份歸屬地");String area =sc.next();System.out.println("請輸入人口數");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("請輸入正確的選項");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內容return document.asXML();}public void print() {// 直接輸出xml內容// 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();// 創建city元素Element city = DocumentHelper.createElement("city");city.addAttribute("id",number);// 創建cityname元素Element citynameElement = DocumentHelper.createElement("cityname");citynameElement.setText(cityname);// 創建cityarea元素Element cityareaElement = DocumentHelper.createElement("cityarea");cityareaElement.setText(cityarea);// 創建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;}
}

運行結果

客戶端啟動成功
請選擇操作
1.輸入城市ID查看城市信息
2.輸入城市id,省份,省份歸屬地,人口數
3.退出
1
客戶端開始發送
客戶端發送成功
請輸入城市ID
010
客戶端開始發送
客戶端發送成功
客戶端開始接收
客戶端接收成功
北京 華北 2114.8萬人 請選擇操作
1.輸入城市ID查看城市信息
2.輸入城市id,省份,省份歸屬地,人口數
3.退出
2
客戶端開始發送
客戶端發送成功
請輸入城市ID
035
請輸入省份
河南
請輸入省份歸屬地
華中
請輸入人口數
1234萬人
客戶端開始發送
客戶端發送成功請選擇操作
1.輸入城市ID查看城市信息
2.輸入城市id,省份,省份歸屬地,人口數
3.退出
1
客戶端開始發送
客戶端發送成功
請輸入城市ID
035
客戶端開始發送
客戶端發送成功
客戶端開始接收
客戶端接收成功
河南 華中 1234萬人 請選擇操作
1.輸入城市ID查看城市信息
2.輸入城市id,省份,省份歸屬地,人口數
3.退出
服務器啟動成功
客戶端已連接
服務器開始接收
收到客戶端指令: 1
服務器開始接收
查詢省份id: 010
服務器開始發送
服務器發送成功服務器開始接收
收到客戶端指令: 2
服務器開始接收
添加城市信息: [035, 河南, 華中, 1234萬人]
035
河南
華中
1234萬人
服務器開始接收
收到客戶端指令: 1
服務器開始接收
查詢省份id: 035
服務器開始發送
服務器發送成功服務器開始接收
<?xml version="1.0" encoding="UTF-8"?><citys> <city id="010"> <cityname>北京</cityname>  <cityarea>華北</cityarea>  <population>2114.8萬人</population> </city>  <city id="021"> <cityname>上海</cityname>  <cityarea>華東</cityarea>  <population>2,500萬人</population> </city>  <city id="020"> <cityname>廣州</cityname>  <cityarea>華南</cityarea>  <population>1292.68萬人</population> </city>  <city id="028"> <cityname>成都</cityname>  <cityarea>華西</cityarea>  <population>1417萬人</population> </city>  <city id="035"><cityname>河南</cityname><cityarea>華中</cityarea><population>1234萬人</population></city>
</citys>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81144.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81144.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot異步任務失效的8大原因及解決方案

Spring Boot異步任務失效的8大原因及解決方案 摘要:在使用Spring Boot的@Async實現異步任務時,你是否遇到過異步不生效的問題?本文總結了8種常見的異步失效場景,并提供對應的解決方案,幫助你徹底解決異步任務失效的難題。 一、異步失效的常見場景 1. 未啟用異步支持 ? …

QT6 源(104)篇一:閱讀與注釋QAction,其是窗體菜單欄與工具欄里的菜單項,先給出屬性測試,再給出成員函數測試,最后給出信號函數的學習于舉例測試

&#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09;接著給出成員函數測試 &#xff1a; &#xff08;4&#xff09; 給個信號函數的舉例 &#xff1a; &#xff08;5&#xff09; 謝謝

visual studio生成動態庫DLL

visual studio生成動態庫DLL 創建動態庫工程 注意 #include “pch.h” 要放在上面 完成后點擊生成 創建一個控制臺項目 設置項目附加目錄為剛才創建的動態庫工程Dll1&#xff1a; 配置附加庫目錄&#xff1a; 配置動態庫的導入庫&#xff08;.lib&#xff09;&#xff1a;鏈…

matlab多智能體網絡一致性研究

一個基于連續時間多智能體系統&#xff08;Multi-Agent Systems, MAS&#xff09;的一階一致性協議的MATLAB仿真代碼&#xff0c;包含網絡拓撲建模、一致性協議設計和收斂性分析。代碼支持固定拓撲和時變拓撲&#xff0c;適用于學術研究。 1. 基礎模型與代碼框架 (1) 網絡拓撲…

【omnet++】omnet++6.0.3中調用python

版本&#xff1a; omnet 6.0.3 Ubuntu 20.04.6 LTS omnet的installguide中對ubuntu版本是有要求的&#xff0c;找到對應版本下載即可 先安裝omnet再安裝anaconda omnet 6.0.3安裝 別在網上找教程了&#xff0c;官方的installguide手冊是最好的。按照手冊安裝一些依賴包后 so…

【C++】 —— 筆試刷題day_29

一、排序子序列 題目解析 一個數組的連續子序列&#xff0c;如果這個子序列是非遞增或者非遞減的&#xff1b;這個連續的子序列就是排序子序列。 現在給定一個數組&#xff0c;然后然我們判斷這個子序列可以劃分成多少個排序子序列。 例如&#xff1a;1 2 3 2 2 1 可以劃分成 …

UE RPG游戲開發練手 第二十七課 普通攻擊2

UE RPG游戲開發練手 第二十七課 普通攻擊2 1. 創建普通攻擊的蒙太奇動畫 2.打開4個蒙太奇動畫&#xff0c;修改插槽為FullBody,修改動畫速度 3.編輯動畫藍圖&#xff0c;插入FullBody插槽讓普通攻擊動畫得以播放 4. 編輯GA_LightAttack技能藍圖

MySQL——日志

undo log(回滾日志)&#xff1a;引擎層生成的日志&#xff0c;實現了事務的原子性&#xff0c;用于事務回滾和MVCC。redo log(重做日志)&#xff1a;引擎層生成的日志&#xff0c;實現了事務的持久性&#xff0c;用于非正常關閉的數據恢復。bin log(歸檔日志)&#xff1a;Serve…

QML 動畫控制、順序動畫與并行動畫

目錄 引言相關閱讀基礎屬性說明工程結構示例代碼解析示例1&#xff1a;手動控制動畫&#xff08;ControlledAnimation.qml&#xff09;示例2&#xff1a;順序動畫&#xff08;SequentialAnimationDemo.qml&#xff09;示例3&#xff1a;并行動畫&#xff08;ParallelAnimationD…

PowerShell 實現 conda 懶加載

問題 執行命令conda init powershell會在 profile.ps1中添加conda初始化的命令。 即使用戶不需要用到conda&#xff0c;也會初始化conda環境&#xff0c;拖慢PowerShell的啟動速度。 解決方案 本文展示了如何實現conda的懶加載&#xff0c;默認不加載conda環境&#xff0c;只…

R語言學習--Day03--數據清洗技巧

在一般情況下&#xff0c;我們都是在數據分析的需求前提下去選擇使用R語言。而實際上&#xff0c;數據分析里&#xff0c;百分之八十的工作&#xff0c;都是在數據清洗。并不只是我們平時會提到的異常值處理或者是整合格式&#xff0c;更多會涉及到將各種各樣的數據整合&#x…

谷歌地圖代理 | 使用 HTML 和矢量模式 API 更輕松地創建 Web 地圖

在過去的一年里&#xff0c;谷歌對 Maps JavaScript API 進行了兩項重要更新&#xff0c;以便更輕松地采用我們最新、最好的地圖&#xff1a;HTML 地圖和矢量模式 API。今天谷歌地圖亞太區最大代理商之一的 Cloud Ace云一 為大家介紹一下更新的具體內容。 聯系我們 - Cloud Ac…

WL-G4048 Multi-Port PCIe 4.0 Switch

系列文章目錄 文章目錄 系列文章目錄《WL-G4048 Multi-Port PCIe 4.0 Switch數據手冊》總結一、芯片介紹二、芯片規格介紹&#xff08;一&#xff09;功能指標&#xff08;二&#xff09;管理調試和監控&#xff08;三&#xff09;參考時鐘&#xff08;四&#xff09;系統復位 …

召回11:地理位置召回、作者召回、緩存召回

GeoHash 召回 屬于地理位置召回&#xff0c;用戶可能對附近發生的事情感興趣。GeoHash 是一種對經緯度的編碼&#xff0c;地圖上每個單位矩形的 GeoHash 的前幾位是相同的&#xff0c;GeoHash 編碼截取前幾位后&#xff0c;將相同編碼發布的內容按時間順序&#xff08;先是時間…

高效批量合并Word文檔的工具介紹

軟件介紹 本文介紹一款專門用于批量合并Word文檔的工具&#xff0c;名為批量合并word工具。 使用方法與特點 如果需要將多個Word文檔合并到一個Word文檔中&#xff0c;就可以使用這款工具。使用前&#xff0c;需把要合并的Word文檔都放在名為“word”的文件夾下。 該軟件沒有…

機器學習入門之KNN算法和交叉驗證與超參數搜索(三)

機器學習入門之KNN算法和交叉驗證與超參數搜索&#xff08;三&#xff09; 文章目錄 機器學習入門之KNN算法和交叉驗證與超參數搜索&#xff08;三&#xff09;一、KNN算法-分類1. 樣本距離判斷明可夫斯基距離 2. KNN 算法原理3. KNN 的缺點4. KNN 的 API5. 使用 sklearn 實現 …

小剛說C語言刷題—1700請輸出所有的2位數中,含有數字2的整數

1.題目描述 請輸出所有的 2 位數中&#xff0c;含有數字 2 的整數有哪些&#xff0c;每行 1個&#xff0c;按照由小到大輸出。 比如&#xff1a; 12、20、21、22、23… 都是含有數字 2的整數。 輸入 無 輸出 按題意要求由小到大輸出符合條件的整數&#xff0c;每行 1 個。…

在MYSQL中導入cookbook.sql文件

參考資料&#xff1a; GitHub 項目&#xff1a;svetasmirnova/mysqlcookbook CSDN 博客&#xff1a;https://blog.csdn.net/u011868279/category_11645577.html 建庫&#xff1a; mysql> use mysql Reading table information for completion of table and column names …

Scrapy框架下地圖爬蟲的進度監控與優化策略

1. 引言 在互聯網數據采集領域&#xff0c;地圖數據爬取是一項常見但具有挑戰性的任務。由于地圖數據通常具有復雜的結構&#xff08;如POI點、路徑信息、動態加載等&#xff09;&#xff0c;使用傳統的爬蟲技術可能會遇到效率低下、反爬策略限制、任務進度難以監控等問題。 …

【Win32 API】 lstrcmpA()

作用 比較兩個字符字符串&#xff08;比較區分大小寫&#xff09;。 lstrcmp 函數通過從第一個字符開始檢查&#xff0c;若相等&#xff0c;則檢查下一個&#xff0c;直到找到不相等或到達字符串的末尾。 函數 int lstrcmpA(LPCSTR lpString1, LPCSTR lpString2); 參數 lpStr…