我正在从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>
答案 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。