使用 sax 解析 xml 响应
Parse xml response using sax
我一直在按照 this 教程使用 sax 解析器。如果我的输入使用的是 xml 文件,那么下面的行工作正常。但是我怎样才能解析 xml 作为网络服务的响应。如何将 soap 响应作为输入传递给 sax 解析器?
new MySaxParser("catalog.xml");
我的代码
public class soapTest{
private static SOAPMessage createSoapRequest() throws Exception{
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
soapEnvelope.addNamespaceDeclaration("action", "http://www.webserviceX.NET/");
SOAPBody soapBody = soapEnvelope.getBody();
SOAPElement soapElement = soapBody.addChildElement("GetQuote", "action");
SOAPElement element1 = soapElement.addChildElement("symbol", "action");
element1.addTextNode("ticket");
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("SOAPAction", "http://www.webserviceX.NET/GetQuote");
soapMessage.saveChanges();
System.out.println("----------SOAP Request------------");
soapMessage.writeTo(System.out);
return soapMessage;
}
private static void createSoapResponse(SOAPMessage soapResponse) throws Exception {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
Source sourceContent = soapResponse.getSOAPPart().getContent();
System.out.println("\n----------SOAP Response-----------");
StreamResult result = new StreamResult(System.out);
transformer.transform(sourceContent, result);
}
public static void main(String args[]){
try{
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
String url = "http://www.webservicex.net/stockquote.asmx?wsdl";
SOAPMessage soapRequest = createSoapRequest();
//hit soapRequest to the server to get response
SOAPMessage soapResponse = soapConnection.call(soapRequest, url);
// Not able to proceed from here. How to use sax parser here
soapConnection.close();
}catch (Exception e) {
e.printStackTrace();
}
}
如何从 xml 响应中解析并获取值。
我已经修复了代码,您可以进行以下操作:
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
/**
* Demo xml processing
*/
public class Demo {
private static final Logger log = Logger.getLogger(Demo.class.getName());
private static final int CHUNK = 1048576; //1MB chunk of file
public static void main(String[] args) {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream(CHUNK);
Writer writer = new OutputStreamWriter(out, "UTF-8");
/* here put soapMessage.writeTo(out);
I will just process this hard-coded xml */
writer.append("<greeting>Hello!</greeting>");
writer.flush();
ByteArrayInputStream is
= new ByteArrayInputStream(out.toByteArray());
XMLReader reader = XMLReaderFactory.createXMLReader();
//define your handler which extends default handler somewhere else
MyHandler handler = new MyHandler();
reader.setContentHandler(handler);
/* reader will be closed with input stream */
reader.parse(new InputSource(new InputStreamReader(is, "UTF-8")));
//Hello in the console
} catch (UnsupportedEncodingException ex) {
log.severe("Unsupported encoding");
} catch (IOException | SAXException ex) {
log.severe("Parsing error!");
} finally {
/*everything is ok with byte array streams!
closing them has no effect! */
}
}
}
class MyHandler extends DefaultHandler {
@Override
public void characters(char ch[], int start, int length)
throws SAXException {
System.out.print(String.copyValueOf(ch, start, length));
}
}
我一直在按照 this 教程使用 sax 解析器。如果我的输入使用的是 xml 文件,那么下面的行工作正常。但是我怎样才能解析 xml 作为网络服务的响应。如何将 soap 响应作为输入传递给 sax 解析器?
new MySaxParser("catalog.xml");
我的代码
public class soapTest{
private static SOAPMessage createSoapRequest() throws Exception{
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
soapEnvelope.addNamespaceDeclaration("action", "http://www.webserviceX.NET/");
SOAPBody soapBody = soapEnvelope.getBody();
SOAPElement soapElement = soapBody.addChildElement("GetQuote", "action");
SOAPElement element1 = soapElement.addChildElement("symbol", "action");
element1.addTextNode("ticket");
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("SOAPAction", "http://www.webserviceX.NET/GetQuote");
soapMessage.saveChanges();
System.out.println("----------SOAP Request------------");
soapMessage.writeTo(System.out);
return soapMessage;
}
private static void createSoapResponse(SOAPMessage soapResponse) throws Exception {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
Source sourceContent = soapResponse.getSOAPPart().getContent();
System.out.println("\n----------SOAP Response-----------");
StreamResult result = new StreamResult(System.out);
transformer.transform(sourceContent, result);
}
public static void main(String args[]){
try{
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
String url = "http://www.webservicex.net/stockquote.asmx?wsdl";
SOAPMessage soapRequest = createSoapRequest();
//hit soapRequest to the server to get response
SOAPMessage soapResponse = soapConnection.call(soapRequest, url);
// Not able to proceed from here. How to use sax parser here
soapConnection.close();
}catch (Exception e) {
e.printStackTrace();
}
}
如何从 xml 响应中解析并获取值。
我已经修复了代码,您可以进行以下操作:
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
/**
* Demo xml processing
*/
public class Demo {
private static final Logger log = Logger.getLogger(Demo.class.getName());
private static final int CHUNK = 1048576; //1MB chunk of file
public static void main(String[] args) {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream(CHUNK);
Writer writer = new OutputStreamWriter(out, "UTF-8");
/* here put soapMessage.writeTo(out);
I will just process this hard-coded xml */
writer.append("<greeting>Hello!</greeting>");
writer.flush();
ByteArrayInputStream is
= new ByteArrayInputStream(out.toByteArray());
XMLReader reader = XMLReaderFactory.createXMLReader();
//define your handler which extends default handler somewhere else
MyHandler handler = new MyHandler();
reader.setContentHandler(handler);
/* reader will be closed with input stream */
reader.parse(new InputSource(new InputStreamReader(is, "UTF-8")));
//Hello in the console
} catch (UnsupportedEncodingException ex) {
log.severe("Unsupported encoding");
} catch (IOException | SAXException ex) {
log.severe("Parsing error!");
} finally {
/*everything is ok with byte array streams!
closing them has no effect! */
}
}
}
class MyHandler extends DefaultHandler {
@Override
public void characters(char ch[], int start, int length)
throws SAXException {
System.out.print(String.copyValueOf(ch, start, length));
}
}