读入 XML 到文件 Java

Posted

技术标签:

【中文标题】读入 XML 到文件 Java【英文标题】:Read in XML to file Java 【发布时间】:2011-12-19 00:20:58 【问题描述】:

我有一个服务器,它接受一个 WSDL 请求并逐行发回 WSDL 的 XML。我知道请求正在被正确接收和处理,因为我让服务器在写入服务器套接字时将 XML 打印到控制台。我现在的问题是我的客户端应用程序应该在 xml 中读取,然后使用 xml 打印出方法签名。我将使用 DOM / DocumentBuilder 从 WSDL 获取方法签名的部分,但我需要首先将读入的行放入文件中。我怎样才能做到这一点?目前我正在尝试这样做:

        //request WSDL from server
        System.out.println("Client requesting \"MathServices?wsdl\"...");
        socketWriter.write("GET MathServices?wsdl");
        socketWriter.close();

        //read XML response into file       
        try 
            File wsdlXML = new File("MathServices.xml");
            FileOutputStream wsdlXmlWriter = new FileOutputStream(wsdlXML);

            String xmlLine;
            while((xmlLine = socketReader.readLine()) != null)
                wsdlXmlWriter.write(xmlLine.getBytes());
            
         catch (IOException e) 
            e.printStackTrace();
        

但是我得到了这个错误:

客户端请求“MathServices?wsdl”... java.net.SocketException:套接字关闭 在 java.net.SocketInputStream.socketRead0(本机方法) 在 java.net.SocketInputStream.read(SocketInputStream.java:129) 在 sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) 在 sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) 在 sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) 在 java.io.InputStreamReader.read(InputStreamReader.java:167) 在 java.io.BufferedReader.fill(BufferedReader.java:136) 在 java.io.BufferedReader.readLine(BufferedReader.java:299) 在 java.io.BufferedReader.readLine(BufferedReader.java:362) 在 client.Client.main(Client.java:50)

编辑:服务器代码

package server;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;

public class RequestHandler extends Thread 

    Object block;
    ServerSocket serverSocket;
    BufferedReader socketReader;
    PrintWriter socketWriter;

    public RequestHandler(Object block, ServerSocket serverSocket)
        this.block = block;
        this.serverSocket = serverSocket;
    

    @Override
    public void run() 
        try
            System.out.println("Waiting for connection...");
            Socket clientSocket = serverSocket.accept();
            System.out.println("Connection made.");

            synchronized(block)
                System.out.print("Notifying server thread...");
                block.notify();
                System.out.println("...done");
                System.out.println();
            

            System.out.println("Setting up streams...");
            socketReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));            
            socketWriter = new PrintWriter(clientSocket.getOutputStream(), true);
            System.out.println("Reading request");

            String input;
            while((input = socketReader.readLine()) != "\n")
                //System.out.println("Input: " +input);

                if(input.startsWith("GET"))
                    System.out.println("GET received.");
                    getResource(input);
                
            

            socketWriter.close();
            socketReader.close();
            clientSocket.close();

            System.out.println("Streams closed.");
        catch(IOException e)
            System.out.println("IOException!");
            e.printStackTrace();
        
    

    public void getResource(String getRequest)
        String[] parts = getRequest.split("\\s+");
        String filename = parts[1].substring(1);

        if(filename.equals("MathServices?wsdl"))
            filename = "MathServices.wsdl";
        
        System.out.println(filename);
        File resource = new File(filename);             
        sendResponse(resource, 1);
    

    public void sendResponse(File resource, int type)
        System.out.println(resource.getAbsolutePath());

        Scanner fileReader;

        try 
            fileReader = new Scanner(resource);

            while(fileReader.hasNext())
                String line = fileReader.nextLine();
                System.out.println(line);
                socketWriter.println(line);
            
            socketWriter.println("\n");
            System.out.println("end of response");
            socketWriter.close();

         catch (FileNotFoundException e) 
            System.out.println("File not found!");
            e.printStackTrace();
        
    


【问题讨论】:

【参考方案1】:

看起来您在阅读 socketReader 之前要关闭 Socket。在关闭Socket 之前,您必须完全读取该对象的结果。这是所有的代码吗?您也可以尝试在关闭之前添加socketWriter.flush()

编辑:

我注意到您正在向服务器发送GET 请求,大概是打算发出HTTP GET?如果是这样,您的请求格式不正确。试试这个:

socketWriter.write("GET /MathServices?wsdl HTTP/1.1\r\n\r\n");

您最好使用 java.net.URLConnection 或 Apache HttpClient 来完成此任务。

【讨论】:

这不是所有的代码,但我认为其余的与这个特定部分无关。顺便说一下,我的 socketReader 设置为自动刷新。至于关闭,如果我不在那里关闭 socketWriter,那么我的请求永远不会完成对服务器的写入,并且没有任何东西被发回。它会一直挂在那里,直到套接字关闭。 我想我现在看到了问题所在。我正在修改我的答案。 很抱歉不清楚,但我开发了服务器。这有点令人费解,但基本上它只接受来自客户端的任何输入,如果它以“GET”开头,那么它会将空格后面的部分解析为文件名。它(服务器)然后将该文件名传递给 sendResponse()方法逐行读取文件,然后将其写入服务器套接字的输出。然后客户端应该逐行读取该输出并将这些行写入一个新文件,制作一个用于 DOM 的 XML 文件。 我明白了。在没有看到服务器代码的情况下,看起来服务器在完成写入响应之前就关闭了自己的套接字。

以上是关于读入 XML 到文件 Java的主要内容,如果未能解决你的问题,请参考以下文章

如何将文本文件资源读入 Java 单元测试?

XSLT 2 (Saxon):如何将多个文件读入内存

PB如何解析XML文件

将 XML 文件读入 XmlDocument

[学习手记] Java中利用DOM方法解析XML文件

使用 Jackson 将单个文件中的多个 JSON 对象读入 Java