【发布时间】:2021-11-22 14:28:11
【问题描述】:
我成功地进行了一个 API 调用,它是一个 SOAP 请求,正文中包含一个帐号。我使用Httpurlconnection 连接,我正在使用BufferedReader 读取这些结果:
if (responseCode == HttpURLConnection.HTTP_OK) { // success
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
{
sb.append(inputLine).append("\n");
String xml2String = sb.toString();
然后使用documentbuilderfactory 构建文档以读入解析器:
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();
Document xmlDom = docBuilder.parse(new InputSource(inputLine));
然后尝试解析:
DOMParser parser = new DOMParser();
parser.parse(new InputSource(new StringReader(returnList.item(0).getTextContent())));
Document doc = parser.getDocument();
NodeList responsedata = doc.getDocumentElement().getChildNodes();
NodeList returnList = xmlDom.getElementsByTagName("DATA");
// Get the DATA
DOMParser parser = new DOMParser();
parser.parse(new InputSource(new StringReader(returnList.item(0).getTextContent())));
Document doc = parser.getDocument();
NodeList responsedata = doc.getDocumentElement().getChildNodes();
这是我得到的错误(包括 API 请求的输出):
Exception,no protocol:
{"d":"<DATA><BussFlds><FieldName>FirstName</FieldName><Value><![CDATA[TESTY]]></Value><DataType>String</DataType><Format></Format><Editable>True</Editable></BussFlds><BussFlds><FieldName>LastName</FieldName><Value><![CDATA[TESTER]]></Value><DataType>String</DataType><Format></Format><Editable>True</Editable></BussFlds><BussFlds><FieldName>TYPE</FieldName><Value><![CDATA[]]></Value><DataType>String</DataType><Format></Format><Editable>True</Editable></BussFlds><BussFlds><FieldName>DATE</FieldName><Value><![CDATA[]]></Value><DataType>String</DataType><Format></Format><Editable>True</Editable></BussFlds><BussFlds><FieldName>CUSTCODE</FieldName><Value><![CDATA[]]></Value><DataType>String</DataType><Format></Format><Editable>True</Editable></BussFlds><BussFlds><FieldName>PREMCODE</FieldName><Value><![CDATA[]]></Value><DataType>String</DataType><Format></Format><Editable>True</Editable></BussFlds><BussFlds><FieldName>ADDRESS</FieldName><Value><![CDATA[]]></Value><DataType>String</DataType><Format></Format><Editable>True</Editable></BussFlds><BussFlds><FieldName>CITY</FieldName><Value><![CDATA[]]></Value><DataType>String</DataType><Format></Format><Editable>True</Editable></BussFlds><BussFlds><FieldName>STATE</FieldName><Value><![CDATA[]]></Value><DataType>String</DataType><Format></Format><Editable>True</Editable></BussFlds><BussFlds><FieldName>ZIP</FieldName><Value><![CDATA[]]></Value><DataType>String</DataType><Format></Format><Editable>True</Editable></BussFlds><BussFlds><FieldName>ZIP4</FieldName><Value><![CDATA[]]></Value><DataType>String</DataType><Format></Format><Editable>True</Editable></BussFlds><BussFlds><FieldName>ACCTBALANCE</FieldName><Value><![CDATA[]]></Value><DataType>String</DataType><Format></Format><Editable>True</Editable></BussFlds><BussFlds><FieldName>PASTDUE</FieldName><Value><![CDATA[]]></Value><DataType>String</DataType><Format></Format><Editable>True</Editable></BussFlds><BussFlds><FieldName>PHONE</FieldName><Value><![CDATA[]]></Value><DataType>String</DataType><Format></Format><Editable>True</Editable></BussFlds></DATA>"}
我怀疑是第一行的大括号数据或缺少标题信息,但我不确定这是否是问题或如何解决它。谢谢!
【问题讨论】:
-
1.不要将您的响应读入字符串(一般情况下,不要使用 StringBuffer,它在多年前已被 StringBuilder 取代)。将响应直接传递给 DocumentBuilder:
Document xmlDom = docBuilder.parse(con.getInputStream());2. 您正在读取的响应不是 XML,而是 JSON。"d"对象属性的值似乎是一个 XML 文档,但您首先需要从 JSON 中提取该 XML。 -
我现在收到异常,文件过早结束。我已经在消费这个流了吗? int responseCode = con.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { BufferedReader in = new BufferedReader(new InputStreamReader( con.getInputStream()));字符串输入线; StringBuffer 响应 = new StringBuffer (); while ((inputLine = in.readLine()) != null) { { sb.append(inputLine).append("\n"); xml2String = sb.toString(); in.close();
-
好的,我能够解析出 JSON,因此我只剩下 XML,但我仍然收到无协议错误:异常,无协议:
FirstName String True LastName String True BussFlds>TYPE String True -
停止拨打
docBuilder.parse(new InputSource(inputLine))。该构造函数将字符串视为 URI,而不是 XML 输入。 -
我正在使用解析 json 的输出(这将输出减少到只是 XML): JSONObject json = new JSONObject(sb.toString()); jdata = json.getString("d"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();文档 xmlDom = docBuilder.parse(jdata);