我成功地進行了 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>"}?????
我懷疑是第一行的大括號資料或缺少標題資訊,但我不確定這是否是問題或如何解決。謝謝!
uj5u.com熱心網友回復:
在
docBuilder.parse(new InputSource(inputLine))
您正在使用字串緩沖區。用您的變數 xml2String 替換它
uj5u.com熱心網友回復:
這個回應:
{"d":"<DATA><BussFlds>…
是不是XML。您無法使用 DocumentBuilder 讀取它。
該回應采用稱為JSON的格式。您不能使用 XML 決議器來讀取它。
因此,您需要將回應傳遞給 JSON 決議器,而不是XML 決議器。
JSON“物件”基本上是一個帶有字串鍵的字典(即查找表)。您的回應只有一個條目,其鍵是"d"。因此,您首先需要將回應決議為 JSON:
String xml;
try (JsonParser jsonParser = Json.createParser(con.getInputStream())) {
xml = jsonParser.getObject().getString("d");
}
(還有其他 JSON 決議庫可用。我為上面的示例選擇了 Java EE 的一部分。)
請注意,代碼中并沒有試圖讀取con.getInputStream()第一個字串。這樣做沒有任何好處。決議器直接接受一個 InputStream。這意味著不需要使用 InputStreamReader、BufferedReader 或 StringBuffer。
現在您在xml變數中有 XML 內容,您可以使用 DocumentBuilder 決議它:
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();
Document xmlDom = docBuilder.parse(new InputSource(new StringReader(xml)));
旁注:您永遠不應該使用 StringBuffer。請改用 StringBuilder。StringBuffer 是一個已有 26 年歷史的類,它是 Java 1.0 的一部分,它是為多執行緒使用而設計的,這幾乎從不需要,并且會增加很多開銷。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/317023.html
