欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java中XML的使用全過(guò)程

 更新時(shí)間:2025年05月21日 15:50:30   作者:xrkhy  
這篇文章主要介紹了java中XML的使用全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

什么是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í)可以用如下特殊字符替代。

指定字符特殊字符含義
&lt;<小于
&gt;>大于
&amp;&小于
&apos;單引號(hào)
&quot;"雙引號(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 &gt; 2 &amp;&amp; 3 &lt; 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)

  1. 基于XML文檔樹結(jié)構(gòu)的解析
  2. 適用于多次訪問(wèn)的XML文檔
  3. 特點(diǎn):比較消耗資源

SAX(內(nèi)置解析XML)

  1. 基于事件的解析
  2. 適用于大數(shù)據(jù)量的XML文檔
  3. 特點(diǎn):占用資源少,內(nèi)存消耗小

DOM4J

  1. 非常優(yōu)秀的Java XML API
  2. 性能優(yōu)異、功能強(qiáng)大
  3. 開放源代碼

??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文件步驟

  1. 創(chuàng)建解析器工廠對(duì)象
  2. 解析器工廠對(duì)象創(chuàng)建解析器對(duì)象
  3. 解析器對(duì)象指定XML文件創(chuàng)建Document對(duì)象
  4. 以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文件

步驟

  1. 獲得TransformerFactory對(duì)象
  2. 創(chuàng)建Transformer對(duì)象
  3. 創(chuàng)建DOMSource對(duì)象:包含XML信息
  4. 設(shè)置輸出屬性:編碼格式
  5. 創(chuàng)建StreamResult對(duì)象:包含保存文件的信息
  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. 創(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ī)收藏

  1. 添加新的Brand:三星
  2. 給Brand節(jié)點(diǎn)添加新的子標(biāo)簽Type:Note4
  3. 將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文件

  1. 顯示手機(jī)收藏信息
  2. 保存手機(jī)收藏信息
  3. 為手機(jī)收藏信息添加新的節(jié)點(diǎn)
  4. 修改/刪除手機(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)文章

  • Java?輕松入門使用Fiddler抓包工具教程

    Java?輕松入門使用Fiddler抓包工具教程

    超文本傳輸協(xié)議(HTTP)是一個(gè)簡(jiǎn)單的請(qǐng)求-響應(yīng)協(xié)議,其主要是基于TCP來(lái)實(shí)現(xiàn)的,可以通過(guò)Chrome開發(fā)者工具或者Wireshark或者Fiddler抓包,以便分析?HTTP?請(qǐng)求/響應(yīng)的細(xì)節(jié),本篇博客主要談?wù)撊绾问褂肍iddler抓取HTTP,當(dāng)然也可以抓取HTTPS
    2022-02-02
  • Java使用JDBC連接數(shù)據(jù)庫(kù)

    Java使用JDBC連接數(shù)據(jù)庫(kù)

    本文詳細(xì)講解了Java使用JDBC連接數(shù)據(jù)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • spring注入配置文件屬性到j(luò)ava類

    spring注入配置文件屬性到j(luò)ava類

    這篇文章主要為大家介紹了spring注入配置文件屬性到j(luò)ava類實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java經(jīng)典面試題最全匯總208道(六)

    Java經(jīng)典面試題最全匯總208道(六)

    這篇文章主要介紹了Java經(jīng)典面試題最全匯總208道(六),本文章內(nèi)容詳細(xì),該模塊分為了六個(gè)部分,本次為第六部分,需要的朋友可以參考下
    2023-01-01
  • SpringBoot中5種高大上的yml文件讀取方式

    SpringBoot中5種高大上的yml文件讀取方式

    本文主要介紹了SpringBoot中5種高大上的yml文件讀取方式,總結(jié)一下除了@Value和@ConfigurationProperties外,還能夠通過(guò)哪些方式,來(lái)讀取yml配置文件的內(nèi)容,感興趣的可以了解一下
    2022-03-03
  • Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析

    Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析

    這篇文章主要介紹了Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Spring Boot Security配置教程

    Spring Boot Security配置教程

    在本文里我們給大家分享了關(guān)于Spring Boot Security配置的相關(guān)步驟以及注意要點(diǎn),需要的朋友們跟著操作下。
    2019-05-05
  • 看完這篇文章獲得一些java if優(yōu)化技巧

    看完這篇文章獲得一些java if優(yōu)化技巧

    if 是每個(gè)語(yǔ)言都有的語(yǔ)法,也是最基礎(chǔ)的語(yǔ)法。因?yàn)榇a本來(lái)就很晦澀,所以才有了程序員這個(gè)中間件,今天就聊一下我的一些關(guān)于 if 思路和總結(jié)
    2021-07-07
  • 簡(jiǎn)單介紹Java?方法的重載、可變參數(shù)、作用域

    簡(jiǎn)單介紹Java?方法的重載、可變參數(shù)、作用域

    這篇文章主要簡(jiǎn)單介紹Java?方法的重載、可變參數(shù)、作用域的相關(guān)資料,需要的朋友可以參考下
    2023-07-07
  • Java編程簡(jiǎn)單應(yīng)用

    Java編程簡(jiǎn)單應(yīng)用

    本文主要介紹了三個(gè)簡(jiǎn)單Java小程序———1、HelloWorld(HelloWorld的來(lái)源);2、輸出個(gè)人信息3、輸出特殊圖案。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02

最新評(píng)論