在Java中逐行读取

时间:2018-07-27 16:01:24

标签: java xml servlets request byte

我正在从POST接收xml文件。 我正在尝试读取xml文件中的内容,但是我得到的答案对我来说并不是逻辑。 我只想读第三行,但这似乎是我的程序唯一不想读的那一行。

.JAVA:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    int line=0;
    byte[] buffer=new byte[1000];
    while(line<5) {
        request.getInputStream().readLine(buffer, 0, buffer.length);
        line++;
    }
    String name = new String(buffer, "UTF-8");
    System.out.println(name);
}

.XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Trias xmlns:siri="http://www.siri.org.uk/siri" xmlns="http://www.vdv.de/trias" xmlns:ns3="http://www.ifopt.org.uk/acsb" xmlns:ns4="http://www.ifopt.org.uk/ifopt" xmlns:ns5="http://datex2.eu/schema/1_0/1_0" version="1.2">
    <siri:CheckStatusRequest>
        <siri:RequestTimestamp>2018-03-12T16:36:30.002+01:00</siri:RequestTimestamp>

2 个答案:

答案 0 :(得分:2)

您不希望第三行包含感兴趣的内容。 XML元素之间不需要换行符。例如,请求主体可以按以下方式传递:

<Trias …><siri:CheckStatusRequest><siri:RequestTimestamp>2018-03-12T16:36:30.002+01:00</siri:RequestTimestamp></siri:CheckStatusRequest></Trias>

(为清楚起见,省略了Trias属性。)

Java有很多读取XML的工具。就您而言,XPath可能是最简单的:

XPath xpath = XPathFactory.newInstance().newXPath();
String timeStr = xpath.evaluate("//*[local-name()='RequestTimestamp']",
    new InputSource(request.getInputStream()));
OffsetDateTime timestamp = OffsetDateTime.parse(timeStr);

答案 1 :(得分:1)

使用readLine()进行读取时,您应该检查返回值,以确保您未超出流的末尾。

int line = 0;
byte[] buffer = new byte[1000];
while (line < 5) {
    int read = request.getInputStream().readLine(buffer, 0, buffer.length);
    if (read < 0) {
        break; // end of stream reachead
    }
    line++;
}

但是,最好使用解析器读取XML,例如SAX。这样一来,您可以专注于业务任务,而不必处理框架任务,例如XML normalization