java - 使用 sax 解析 xml 响应

标签 java xml jaxb sax saxparser

我一直在关注this使用 sax 解析器的教程。如果我的输入使用 xml 文件,那么下面的行工作正常。但是我如何才能解析从 Web 服务获得的响应 xml。如何将肥皂响应作为输入传递给 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));
    }
}

关于java - 使用 sax 解析 xml 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42176860/

相关文章:

xml - 使用 XSLT 2.0 将 CSV 转换为 XML

java - JAXB XJC 抑制 ObjectFactory 并生成 jaxb.in​​dex

java - 使用组合(java)时如何实现关闭开关?

java - 并行化任务但保留输出中的输入顺序

javascript - 替换 node.js 中 XML Node 中的文本

xml - 超过 Coldfusion CFQUERY 时间限制

java - java 中 toString() 的替代方法

java - JAXB 将 xml 列表元素解码为单个 Kotlin 对象

java - 读取前刷新/清除 System.in (stdin)

Java:使用 Class.forName 动态获取自身的新实例