69期-Java SE-029_XML解析

 

### 綜合練習

使用 Socket 和多線程編寫一個簡單的聊天小程序,要求客戶端和服務端交替發送消息,在客戶端和服務端都能看到彼此的聊天記錄。

Server

```java
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(8080);
            System.out.println("服務端已啓動");
            while(true) {
                socket = serverSocket.accept();
                new Thread(new SocketThread(socket)).start();;
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
```

ServerThread

```java
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class SocketThread implements Runnable {
    private Socket socket;
    public SocketThread(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        InputStream inputStream = null;
        DataInputStream dataInputStream = null;
        Scanner scanner = new Scanner(System.in);
        String message = null;
        OutputStream outputStream = null;
        DataOutputStream dataOutputStream = null;
        try {
            while(true) {
                //
                inputStream = socket.getInputStream();
                dataInputStream = new DataInputStream(inputStream);
                message = dataInputStream.readUTF();
                System.out.println("客戶端:"+message);
                //
                System.out.print("服務器:");
                message = scanner.next();
                outputStream = socket.getOutputStream();
                dataOutputStream = new DataOutputStream(outputStream);
                dataOutputStream.writeUTF(message);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                dataOutputStream.close();
                outputStream.close();
                dataInputStream.close();
                inputStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
```

Client

```java
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        Socket socket = null;
        InputStream inputStream = null;
        DataInputStream dataInputStream = null;
        OutputStream outputStream = null;
        DataOutputStream dataOutputStream = null;
        System.out.println("客戶端已啓動...");
        try {
            socket = new Socket("127.0.0.1", 8080);
            Scanner scanner = new Scanner(System.in);
            String message = null;
            while(true) {
                //
                System.out.print("客戶端:");
                message = scanner.next();
                outputStream = socket.getOutputStream();
                dataOutputStream = new DataOutputStream(outputStream);
                dataOutputStream.writeUTF(message);
                //
                inputStream = socket.getInputStream();
                dataInputStream = new DataInputStream(inputStream);
                message = dataInputStream.readUTF();
                System.out.println("服務器:"+message);
            }
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                dataInputStream.close();
                inputStream.close();
                dataOutputStream.close();
                outputStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
```



### XML 解析

XML:Extensible Markup Language 可擴展標記語言

特色:

XML 與操做系統無關、與編程語言無關,能夠實現不一樣系統之間的數據交換。

XML 文檔內容由一系列標籤元素組成

<標籤名 屬性名="屬性值">元素內容</標籤名>

- 屬性值用雙引號包裹
- 一個元素能夠包含多個屬性
- 屬性值中不能直接包含<、>、"、&、'

```xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book id="001">
        <author>張三</author>
        <name>Java高級編程</name>
        <description>Java是一門面向對象高級編程語言</description>
    </book>
    <book id="002" author="李四" name="C#" description="面向對象"></book>
</books>
```

注意事項

- 全部 XML 元素都必須有結束標籤
- XML 標籤對大小寫敏感
- XML 必須有正確的嵌套
- 同級標籤以縮進對齊
- 元素名稱能夠包含字母、數字或其餘字符
- 元素名稱不能以數字或標點符號開頭
- 元素名稱不能包含空格

XML 的轉義字符

特殊字符:<    >    "    '    &

轉義符:

```
&lt;    &gt;    &quot;    &apos;    &amp;
```



衣服型號                            對應身高

S                                                <165

M                                            165-170

L                                              170-175

XL                                            175-180

XXL                                            180-185

```xml
<?xml version="1.0" encoding="UTF-8"?>
<cloth>
    <size range="height&gt;165">S</size>
    <size range="165&lt;height&lt;170">M</size>
    <size range="170&lt;height&lt;175">L</size>
    <size range="175&lt;height&lt;180">XL</size>
    <size range="180&lt;height&lt;185">XXL</size>
</cloth>
```



考生姓名            預計得分            實際得分

張三                        75                        80

李四                        75                        88

```xml
<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student name="張三" expected_score="75" score="80"></student>
    <student name="李四" expected_score="75" score="88"></student>
</students>
```



### 解析XML

用 Java 程序讀取、操做 XML 文件中的數據

dom4j 主流的 Java XML API,性能優異,功能強大。

```xml
<?xml version="1.0" encoding="GBK"?>
<phoneinfo id="1">
    <brand name="華爲">
        <type name="U8650"></type>
        <type name="HW123"></type>
        <type name="HW321"></type>
    </brand>
    <brand name="蘋果">
        <type name="iPhone"></type>
    </brand>
    <brand name="三星">
        <type name="Note4"></type>
    </brand>
</phoneinfo>
```

```java
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Test {
    public static void main(String[] args) {
        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read("src/phone.xml");
            //獲取根節點
            Element root = document.getRootElement();
            Iterator<Element> rootIter = root.elementIterator();
            while(rootIter.hasNext()) {
                Element ele = rootIter.next();
                String name = ele.attributeValue("name");
                System.out.println(name);
                Iterator<Element> eleIter = ele.elementIterator();
                while(eleIter.hasNext()) {
                    Element type = eleIter.next();
                    String typeName = type.attributeValue("name");
                    System.out.println(typeName);
                }
            }
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
```

```java
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Test2 {
    public static void main(String[] args) {
        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read("src/phone.xml");
            Element root = document.getRootElement();
            Element newEle = root.addElement("brand");
            newEle.addAttribute("name", "Vivo");
            Element type = newEle.addElement("type");
            type.addAttribute("name", "型號1");
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("UTF-8");
            Writer fileWriter = new FileWriter("src/phone.xml");
            XMLWriter writer = new XMLWriter(fileWriter,format);
            writer.write(document);
            writer.close();
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
```

Client.javajava

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        Socket socket = null;
        InputStream inputStream = null;
        DataInputStream dataInputStream = null;
        OutputStream outputStream = null;
        DataOutputStream dataOutputStream = null;
        System.out.println("客戶端已啓動...");
        try {
            socket = new Socket("127.0.0.1", 8080);
            Scanner scanner = new Scanner(System.in);
            String message = null;
            while(true) {
                //
                System.out.print("客戶端:");
                message = scanner.next();
                outputStream = socket.getOutputStream();
                dataOutputStream = new DataOutputStream(outputStream);
                dataOutputStream.writeUTF(message);
                //
                inputStream = socket.getInputStream();
                dataInputStream = new DataInputStream(inputStream);
                message = dataInputStream.readUTF();
                System.out.println("服務器:"+message);
            }
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                dataInputStream.close();
                inputStream.close();
                dataOutputStream.close();
                outputStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

 

cloth.xml編程

<?xml version="1.0" encoding="UTF-8"?>
<cloth>
    <size range="height&gt;165">S</size>
    <size range="165&lt;height&lt;170">M</size>
    <size range="170&lt;height&lt;175">L</size>
    <size range="175&lt;height&lt;180">XL</size>
    <size range="180&lt;height&lt;185">XXL</size>
</cloth>

 

phone.xml小程序

<?xml version="1.0" encoding="UTF-8"?>

<phoneinfo id="1"> 
  <brand name="華爲"> 
    <type name="U8650"/>  
    <type name="HW123"/>  
    <type name="HW321"/> 
  </brand>  
  <brand name="蘋果"> 
    <type name="iPhone"/> 
  </brand>  
  <brand name="三星"> 
    <type name="Note4"/> 
  </brand>  
  <brand name="Vivo"/>  
  <brand name="Vivo">
    <type name="型號1"/>
  </brand>
</phoneinfo>

 

score.xml服務器

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student name="張三" expected_score="75" score="80"></student>
    <student name="李四" expected_score="75" score="88"></student>
</students>

 

Server.java多線程

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(8080);
            System.out.println("服務端已啓動");
            while(true) {
                socket = serverSocket.accept();
                new Thread(new SocketThread(socket)).start();;
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

 

SocketThread.javadom

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class SocketThread implements Runnable {
    private Socket socket;
    public SocketThread(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        InputStream inputStream = null;
        DataInputStream dataInputStream = null;
        Scanner scanner = new Scanner(System.in);
        String message = null;
        OutputStream outputStream = null;
        DataOutputStream dataOutputStream = null;
        try {
            while(true) {
                //
                inputStream = socket.getInputStream();
                dataInputStream = new DataInputStream(inputStream);
                message = dataInputStream.readUTF();
                System.out.println("客戶端:"+message);
                //
                System.out.print("服務器:");
                message = scanner.next();
                outputStream = socket.getOutputStream();
                dataOutputStream = new DataOutputStream(outputStream);
                dataOutputStream.writeUTF(message);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                dataOutputStream.close();
                outputStream.close();
                dataInputStream.close();
                inputStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

 

Test.javasocket

import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Test {
    public static void main(String[] args) {
        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read("src/phone.xml");
            //獲取根節點
            Element root = document.getRootElement();
            Iterator<Element> rootIter = root.elementIterator();
            while(rootIter.hasNext()) {
                Element ele = rootIter.next();
                String name = ele.attributeValue("name");
                System.out.println(name);
                Iterator<Element> eleIter = ele.elementIterator();
                while(eleIter.hasNext()) {
                    Element type = eleIter.next();
                    String typeName = type.attributeValue("name");
                    System.out.println(typeName);
                }
            }
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

 

test.xml編程語言

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book id="001">
        <author>張三</author>
        <name>Java高級編程</name>
        <description>Java是一門面向對象高級編程語言</description>
    </book>
    <book id="002" author="李四" name="C#" description="面向對象"></book>
</books>

 

Test2.javaide

import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Test2 {
    public static void main(String[] args) {
        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read("src/phone.xml");
            Element root = document.getRootElement();
            Element newEle = root.addElement("brand");
            newEle.addAttribute("name", "Vivo");
            Element type = newEle.addElement("type");
            type.addAttribute("name", "型號1");
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("UTF-8");
            Writer fileWriter = new FileWriter("src/phone.xml");
            XMLWriter writer = new XMLWriter(fileWriter,format);
            writer.write(document);
            writer.close();
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
相關文章
相關標籤/搜索