java读取xml文件(项目实战)

废话不多说,今天来记录一下我这周做的一个项目,最近刚入职,主管就要求我开发一个小项目,该项目很简单,具体项目要求如下:

1.网页前端主页

读入一个XML文件,解析里面的内容,将该XML文件中的Code元素读取出来。代码示例如下:

`<DataField>
        <Data Code="81634910196183669298" Actor="User1" ActDate="2022-08-13 16:04:59" FromCorpID="" CorpOrderID="2" />
        <Data Code="81634910196195965561" Actor="User1" ActDate="2022-08-13 16:04:59" FromCorpID="" CorpOrderID="2" />
        <Data Code="81634910190969596093" Actor="User1" ActDate="2022-08-13 16:04:59" FromCorpID="" CorpOrderID="2" />
      </DataField>`

所以我们现在要做一个前端网页,用于传入XML文件;

该网页要求很简单,有一个标题,有一个选择文件的按钮,和一个上传文件的按钮,只需一小会即可完成,最后大概效果如图所示:

java 处理xml文件 javax xml_java 处理xml文件


该网页源码如下:

<!DOCTYPE html>
<html>
<head>
    <title>仓库溯源系统</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f0f0f0;
        }

        h1 {
            text-align: center;
            margin-top: 50px;
        }

        form {
            width: 50%;
            margin: 50px auto;
            padding: 20px;
            background-color: #fff;
            border-radius: 5px;
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
        }

        label {
            display: block;
            margin-bottom: 10px;
            font-weight: bold;
        }

        input[type="file"] {
            display: block;
            margin-bottom: 20px;
        }

        input[type="submit"] {
            display: block;
            margin: 0 auto;
            padding: 10px 20px;
            background-color: #3e8e41;
            color: #fff;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }

        input[type="submit"]:hover {
            background-color: #4CAF50;
        }
    </style>
</head>
<body>
<h1>仓库溯源系统</h1>
<form method="post" enctype="multipart/form-data" action="/upload">
    <label for="file">请选择一个您要传入的XML文件:</label>
    <input type="file" name="file" id="file">
    <input type="submit" value="上传">
</form>
</body>
</html>

2.读入并解析传入文件

接着要求我们读出该文件中DateField中的Code元素;

<Data Code="81634910196183669298"/>

并存储在一个类型为List的Java对象里面。

所以我们需要写一个接受客户端传来数据的方法,doPost()方法,其用于从客户端接收JSON格式的字符串,将其转换为Java对象,并进行一些处理。在这个方法中,它使用HttpServletRequest对象的getReader()方法获取客户端发送的数据。然后使用Google Gson库将这个数据转换成一个类型为List的Java对象。

方法写好了后,还得做一个结果展现的网页;

该网页要求也很简单,一个标题,然后每一个Code元素单独成一行,后面需要加入两个输入框,以便后面导出新的XML文件,最后再有两个按钮,一个是保存数据到服务器,另一个是导出服务器里面保存的数据,生成新的XML文件。

网页如图所示:

java 处理xml文件 javax xml_XML_02

3.调用解析后传入文件的值

然后现在要求前端页面能够调用刚刚传入List里的值。
所以我们现在又要写一个方法,doGet()方法,其用于获取Code属性值列表并将其转换为JSON格式的字符串,然后将其发送给客户端。在这个方法中,它调用了一个Java程序来获取Code属性值列表,并将其转换成JSON格式的字符串。然后设置响应的内容类型为JSON,使用PrintWriter对象将JSON格式的数据发送给客户端。
前端网页调用如下图所示:

java 处理xml文件 javax xml_java_03


上图可以看到,我们已经能在网页端显示传入的XML文件中里Code属性的值了。下面是以上两个方法的源码实现:

@WebServlet("/DataCodesServlet")
public class DataCodesServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        BufferedReader reader = request.getReader();
        Gson gson = new Gson();
        List<String> codes = gson.fromJson(reader, new TypeToken<List<String>>(){}.getType());
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 调用Java程序获取Code属性值列表
        List<String> codes = new ArrayList<>();
        // ...

        // 将Code属性值列表转换为JSON格式
        Gson gson = new Gson();
        String json = gson.toJson(codes);

        // 设置响应内容类型为JSON
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");

        // 将JSON格式的Code属性值列表发送给客户端
        PrintWriter out = response.getWriter();
        out.print(json);
        out.flush();
    }
}

4.输入新值并与原值一起保存

接下来的需求就是将输入框的两个用户输入的值分别赋给CorpOrderID和ToCorpID,然后点击保存后可以按如下XML文件格式保存到服务器上;

<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="终端接口XML Schema-3.0.xsd" SN="BZ010" Version="3.0" License="1001122">
<Events>
<Event Name="SalesWareHouseOut" MainAction="WareHouseOut">
<ActionMaping>
<Action Name="WareHouseOut">
<ActionData>CorpOrderID</ActionData>
<ActionData>Actor</ActionData>
<ActionData>ToCorpID</ActionData>
<ActionData>ActDate</ActionData>
<ActionData>Code</ActionData>
</Action>
</ActionMaping>
<DataMaping>
<MetaData Name="CorpOrderID" Type="String"/>
<MetaData Name="Actor" Type="String"/>
<MetaData Name="ActDate" Type="Date"/>
<MetaData Name="ToCorpID" Type="String"/>
<MetaData Name="Code" Type="String"/>
</DataMaping>
<DataField>
<Data Code="81634910196183669298" CorpOrderID="1" Actor="admin" ActDate="2023-04-17 01:07:43" DisCorpID="1000127" AssCorpID="" ToCorpID="2" FromPerson="admin"/>
<Data Code="81634910196195965561" CorpOrderID="1" Actor="admin" ActDate="2023-04-17 01:07:43" DisCorpID="1000127" AssCorpID="" ToCorpID="2" FromPerson="admin"/>
<Data Code="81634910190969596093" CorpOrderID="1" Actor="admin" ActDate="2023-04-17 01:07:43" DisCorpID="1000127" AssCorpID="" ToCorpID="2" FromPerson="admin"/>
</DataField>
</Event>
</Events>
</Document>

其中CorpOrderID和ToCorpID是用户自己输入的值,ActDate为系统时间;

最终结果网页图示例如下:

java 处理xml文件 javax xml_xml_04

该结果页面的源码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>XML Data</title>
    <style>
        table {
            border-collapse: collapse;
            width: 100%;
        }
        #my-form button {
            background-color: #007bff;
            color: white;
            border: none;
            padding: 10px 20px;
            border-radius: 5px;
            cursor: pointer;
            font-size: 16px;
        }

        #my-form button:hover {
            background-color: #0069d9;
        }
        #my-form1 button {
            background-color: #007bff;
            color: white;
            border: none;
            padding: 10px 20px;
            border-radius: 5px;
            cursor: pointer;
            font-size: 16px;
        }

        #my-form1 button:hover {
            background-color: #0069d9;
        }

        th, td {
            text-align: center;
            padding: 8px;
            white-space: pre-wrap;
        }

        th {
            background-color: #007bff;
            color: white;
        }

        tr:nth-child(even) {

            background-color: #f2f2f2;
        }

        .hidden {
            display: none;
        }

        .form {
            display: inline-block;
        }

        .input-field {
            margin-left: 10px;
        }
        body {
            margin: 0;
            padding: 0;
        }

        table {
            margin: 0 auto;
        }

        #my-form {
            text-align: center;
            margin-top: 20px;
        }

        h1, h3 {
            margin-top: 20px;
            margin-bottom: 20px;
        }


        .form-text {
            margin-right: 10px;
        }
    </style>
</head>

<body>
<div style="text-align: center;">
    <h1>仓库溯源系统</h1>
</div>
<table>
    <thead>
    <tr>
        <th>Primary Code</th>
        <th>Input Data</th>
    </tr>
    </thead>
    <tbody></tbody>
</table>
<div style="text-align: center;">
    <div style="display: inline-block; text-align: left;">
        <h4>点击保存数据将以上表单数据生成XML文件</h4>
        <h4>点击下载将导出生成XML的文件(注意,请先保存再下载!!!)</h4>
    </div>
</div>
    <div style="text-align: center;">
    <form id="my-form" style="display: inline-block;">
        <!-- 表单元素 -->
        <button type="submit">保存数据</button>
    </form>
    <form id="my-form1" style="display: inline-block;">
        <!-- 表单元素 -->
        <button onclick="exportXML()">下载</button>
    </form>
</div>


<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
    function exportXML() {
        event.preventDefault(); // 阻止默认的表单提交行为
        window.location.href = "http://192.168.2.22:8081/downloadFile?fileName=NewOut.xml";
        alert("已导出XML文件"); // 显示导出文件的消息
    }
    $(document).ready(function() {
        $.ajax({
            type: "GET",
            url: "http://192.168.2.22:8081/data/codes",
            dataType: "json",
            success: function(data) {
                var codes = data.codes;
                var codesArray = codes.toString().split(",");
                var tbody = $("tbody");
                for (var i = 0; i < codesArray.length; i++) {
                    var code = codesArray[i].trim();
                    tbody.append("<tr><td class='code-cell'>" + code + "</td><td class='form-cell'><span class='form-text'>CorpOrderID:</span><input type='text' name='input1' class='input-field' ><span class='form-text'>        ToCorpID:</span><input type='text' name='input2' class='input-field' ></td></tr>");
                }
            }
        });

        $("#my-form").submit(function(event) {
            event.preventDefault();

            var xmlString = '<?xml version="1.0" encoding="utf-8"?><Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="终端接口XML Schema-3.0.xsd" SN="BZ010" Version="3.0" License="1001122"><Events><Event Name="SalesWareHouseOut" MainAction="WareHouseOut"><ActionMaping><Action Name="WareHouseOut"><ActionData>CorpOrderID</ActionData><ActionData>Actor</ActionData><ActionData>ToCorpID</ActionData><ActionData>ActDate</ActionData><ActionData>Code</ActionData></Action></ActionMaping><DataMaping><MetaData Name="CorpOrderID" Type="String"/><MetaData Name="Actor" Type="String"/><MetaData Name="ActDate" Type="Date"/><MetaData Name="ToCorpID" Type="String"/><MetaData Name="Code" Type="String"/></DataMaping><DataField>';

            $("tr").each(function() {
                var code = $(this).find(".code-cell").text().trim();
                var input1 = $(this).find("input[name='input1']").val();
                var input2 = $(this).find("input[name='input2']").val();
                var actDate = new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '');

                if (code != "" && input1 != "" && input2 != "") {
                    xmlString += '<Data Code="' + code + '" CorpOrderID="' + input1 + '" Actor="admin" ActDate="' + actDate + '" DisCorpID="1000127" AssCorpID="" ToCorpID="' + input2 + '" FromPerson="admin"/>';
                }
            });

            xmlString += '</DataField></Event></Events></Document>';

            $.ajax({
                type: "POST",
                url: "http://192.168.2.22:8081/dataout/save",
                data: xmlString,
                contentType: "application/xml",
                success: function() {
                    alert("XML file saved successfully");
                },
                error: function() {
                    alert("Failed to save XML file");
                }
            });
        });
    });
</script>
</body>
</html>

5.将新文件保存

接下来还需写一个保存文件的接口,用于处理HTTP POST请求,当点击下载按钮时,接收一个XML格式的字符串,并将其保存到文件中。文件名为Newout.xml;
源码实现如下:

@PostMapping(value = "/save", consumes = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<String> saveData(@RequestBody String xmlData) {
    try {
        // 指定保存XML文件的目录
        String filePath = "fileout/NewOut.xml";
        File xmlFile = new File(filePath);

        // 将XML数据转换为字节数组
        byte[] xmlBytes = xmlData.getBytes(StandardCharsets.UTF_8);

        // 将XML数据写入文件
        FileUtils.writeByteArrayToFile(xmlFile, xmlBytes);

        return ResponseEntity.ok("XML文件保存成功。");
    } catch (IOException e) {
        e.printStackTrace();
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("保存XML文件时出错:" + e.getMessage());
    }
}

6.源码

至此我们项目的功能已基本实现;

  1. 传入一个XML文件,读出其中指定的数据;
  2. 将数据每行独立展示并附有输入框;
  3. 将输入框里用户新输入的数据、原XML文件读出的数据,按一定格式输出为一个新的XML文件;

完整源码地址:
链接:https://pan.baidu.com/s/1gjCdZv57J_ddLr5Nmz9aQw?pwd=1213
提取码:1213

以上为初次参与的第一个小项目,如有不足请各位大佬指正,也欢迎大家找我探讨代码问题!祝看官们生活如意,人生就如代码一样一路AC!!!