c语言编程笔录

首页 >   > 笔记大全

笔记大全

基于XML的桌面应用的代码详细介绍

更新时间:2023-12-06

概述

XML是一种被广泛应用于数据存储和传输的语言标准。基于XML的桌面应用,通常使用Java开发,可以从外部源(如Web服务器)获取数据,随后将其解析为XML文件类型,然后使用Java编写的GUI(图形用户界面)将这些数据呈现给用户。

public static void main(String args[]) {
    // 1. 在 GUI 上创建一个文本框和按钮
    JTextField userText = new JTextField();
    JButton sendButton = new JButton("发送");
 
    // 2. 添加 action listener,当用户点击按钮时执行
    sendButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
              // 3. 从文本框中获取数据
              String message = userText.getText();
              // 4. 将数据转换为 XML 文件类型
              String xml = "<?xml version='1.0' encoding='UTF-8'?>" + message + "";
              // 5. 将 XML 文件发送到服务器
              sendMessage(xml);
        }
    });
}

将XML解析为Java对象

在基于XML的桌面应用中,我们常常需要将XML数据解析为Java对象以在GUI上呈现。使用Java的DOM API或JAXB API可以轻松地实现这一目标。

// 示例使用JAXB API将XML解析为Java对象
public class Message {
    private String message;
    // 省略 getter 和 setter 方法
    
    public static void main(String args[]) {
        String xml = "<?xml version='1.0' encoding='UTF-8'?>你好";
        // 1. 创建 JAXB 上下文,用于处理 XML 数据
        JAXBContext jaxbContext = JAXBContext.newInstance(Message.class);
        // 2. 使用上下文创建 Unmarshaller 对象,它将把 XML 数据解析为 Java 对象
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        // 3. 将 XML 数据解析为 Java 对象
        Message message = (Message) unmarshaller.unmarshal(new StringReader(xml));
        // 4. 在 GUI 上展示 Java 对象的值
        System.out.println(message.getMessage());
    }
}

使用XML与Web服务器通信

基于XML的桌面应用可以通过互联网与 Web 服务器通信,从而获取和更新数据。这需要使用Java的网络编程API(如Java.net包)来建立服务器连接和处理数据传输。

public class Client {
    // 示范的服务器地址和端口号
    private static final String SERVER_ADDRESS = "localhost";
    private static final int PORT = 8080;

    public static void main(String[] args) {
        try {
            // 1. 建立服务器连接
            Socket clientSocket = new Socket(SERVER_ADDRESS, PORT);
            // 2. 从服务器获取数据
            BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            String serverData = inFromServer.readLine();
            // 3. 使用 XML 将数据解析为 Java 对象
            JAXBContext jaxbContext = JAXBContext.newInstance(Message.class);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            Message message = (Message) unmarshaller.unmarshal(new StringReader(serverData));
            System.out.println(message.getMessage());
            // 4. 向服务器发送数据
            PrintWriter outToServer = new PrintWriter(clientSocket.getOutputStream());
            String xml = "<?xml version='1.0' encoding='UTF-8'?>Hello from client!";
            outToServer.println(xml);
            outToServer.flush();
            clientSocket.close();
        } catch (IOException | JAXBException e) {
            e.printStackTrace();
        }
    }
}

生成XML文件

在基于XML的桌面应用中,我们有时需要将Java对象转换为XML文件类型以进行存储或传输。使用Java的DOM API或StAX API可以轻松地生成XML文件。

// 示例使用DOM API生成XML文件
public class Message {
    private String message;
    // 省略 getter 和 setter 方法
    
    public static void main(String args[]) throws ParserConfigurationException, TransformerException {
        // 1. 创建 DocumentBuilder 对象,用于创建 DOM 树
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 2. 创建 Document 对象,即根元素
        Document document = builder.newDocument();
        Element rootElement = document.createElement("message");
        document.appendChild(rootElement);
        // 3. 添加子元素和数据
        Element messageElement = document.createElement("text");
        messageElement.appendChild(document.createTextNode("你好"));
        rootElement.appendChild(messageElement);
        // 4. 将 DOM 树保存为 XML 文件
        DOMSource domSource = new DOMSource(document);
        StreamResult streamResult = new StreamResult(new File("message.xml"));
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(domSource, streamResult);
    }
}