【问题标题】:How to read XML response from a URL in java?如何从 java 中的 URL 读取 XML 响应?
【发布时间】:2011-01-19 14:08:37
【问题描述】:

我需要编写一个简单的函数,它接受一个 URL 并处理 XML 或 JSON 的响应,我已经检查了 Sun 网站 https://swingx-ws.dev.java.net/servlets/ProjectDocumentList ,但是在任何地方都找不到 HttpRequest 对象,是否可以这样做在 Java 中?我正在编写一个富客户端应用程序。

【问题讨论】:

    标签: java xml httprequest


    【解决方案1】:

    对于输入流的 xml 解析,您可以这样做:

    // the SAX way:
    XMLReader myReader = XMLReaderFactory.createXMLReader();
    myReader.setContentHandler(handler);
    myReader.parse(new InputSource(new URL(url).openStream()));
    
    // or if you prefer DOM:
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(new URL(url).openStream());
    

    但要通过 http 从服务器到客户端进行通信,我更喜欢使用 hessian library 或 springs http 调用程序库

    【讨论】:

    • 感谢您的回复,我将响应放入 DOM,但在以下位置收到堆空间错误:最终响应 res=session.get(url); xml 响应非常大,知道如何摆脱它吗?
    • 是的,DOM 将所有内容读入内存。因此,您应该使用 sax api 或通过 -Xmx512m 增加堆空间。还有其他选择,例如使用拉解析器。
    【解决方案2】:

    如果你想将 XML 直接打印到屏幕上,你可以使用 TransformerFactory

    URL url = new URL(urlString);
    URLConnection conn = url.openConnection();
    
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(conn.getInputStream());
    
    TransformerFactory transformerFactory= TransformerFactory.newInstance();
    Transformer xform = transformerFactory.newTransformer();
    
    // that’s the default xform; use a stylesheet to get a real one
    xform.transform(new DOMSource(doc), new StreamResult(System.out));
    

    【讨论】:

    • 工厂变量重复。
    【解决方案3】:

    通过常规的 http 请求获取您的响应,使用:

    下一步是解析它。查看this article 以了解解析器的选择。

    【讨论】:

    • 您好,感谢您的回复,我确实检查了一些解析器,但问题是我似乎无法在这些解析器和来自 URL 的 xml 响应之间找到一座桥梁,所有解析器都在谈论文件和没有人谈论连接到 URL 的输入流
    • @Imran 他们也都接受输入流,看看他们的 API 文档
    【解决方案4】:

    如果您特别想使用SwingX-WS,请查看XmlHttpRequestJSONHttpRequest

    XMLHttpRequest and Swing 博客文章中有关这些课程的更多信息。

    【讨论】:

    • 您好,谢谢,我确实尝试了这段代码,它看起来非常简单易用,但我下载并包含了库,但在库中找不到 HttpRequest 对象,太奇怪了
    • @Imran 我认为HttpRequest 已被删除,但我指出了要使用的类(博文与代码 IMO 不同步,我加入它仅供参考)。跨度>
    • 是的,这就是我遇到很多麻烦的原因,我尝试修改代码,但似乎找不到合适的对象
    • @Imran 只需使用更专业的XmlHttpRequest 而不是HttpRequest
    【解决方案5】:

    好的,我想我已经解决了下面的问题是一个工作代码

    //
    package xmlhttp;
    
    import org.jdesktop.http.Response;
    
    import org.jdesktop.http.Session;
    
    import org.jdesktop.http.State;
    
    
    
    public class GetXmlHttp{
    
    
        public static void main(String[] args) {
    
            getResponse();
    
        }
    
        public static void getResponse()
        {
    
            final Session session = new Session();
    
            try {
                String url="http://192.172.2.23:8080/geoserver/wfs?request=GetFeature&version=1.1.0&outputFormat=GML2&typeName=topp:networkcoverage,topp:tehsil&bbox=73.07846689124875,33.67929015631999,73.07946689124876,33.68029015632,EPSG:4326";
                final Response res=session.get(url);
                boolean notDone=true;
                do
                {
                    System.out.print(session.getState().toString());
    
                    if(session.getState()==State.DONE)
                    {
                        String xml=res.toString();
                        System.out.println(xml);
                        notDone=false;
    
    
                    }
    
                }while(notDone);
    
            } catch (Exception e1) {
    
                e1.printStackTrace();
            }
    
    
        }
    
    }
    

    【讨论】:

    • 现在变量 xml 正在提供除 xml 响应之外的一些其他信息,我应该简单地将这个字符串传递给解析器还是我需要处理它..xml 响应如下 - ----------- DONE HTTP 200:OK 内容类型:text/xml 服务器:Apache-Coyote/1.1 日期:星期一,2010 年 2 月 22 日 12:35:42 GMT 内容编码:gzip 传输-编码:分块 opengis.net/wfs" xmlns:wfs="op............ ........等等
    【解决方案6】:

    当我尝试实例化解析器时,我发现上面的答案导致我出现异常。我在http://docstore.mik.ua/orelly/xml/sax2/ch03_02.htm 找到了解决此问题的以下代码。

    import org.xml.sax.*;
    import javax.xml.parsers.*;
    
    XMLReader        parser;
    
    try {
        SAXParserFactory factory;
    
        factory = SAXParserFactory.newInstance ();
        factory.setNamespaceAware (true);
        parser = factory.newSAXParser ().getXMLReader ();
        // success!
    
    } catch (FactoryConfigurationError err) {
        System.err.println ("can't create JAXP SAXParserFactory, "
        + err.getMessage ());
    } catch (ParserConfigurationException err) {
        System.err.println ("can't create XMLReader with namespaces, "
        + err.getMessage ());
    } catch (SAXException err) {
        System.err.println ("Hmm, SAXException, " + err.getMessage ());
    }
    

    【讨论】:

      【解决方案7】:

      这段代码是解析XML包装JSON响应并使用ajax在前端显示。

      Required JavaScript code.
      <script type="text/javascript">
      $.ajax({
      	method:"GET",
      	url: "javatpoint.html", 
      	
      	success : function(data) { 
      		
      		 var json=JSON.parse(data);	
      		 var tbody=$('tbody');
      		for(var i in json){
      			tbody.append('<tr><td>'+json[i].id+'</td>'+
      					'<td>'+json[i].firstName+'</td>'+
      					'<td>'+json[i].lastName+'</td>'+
      					'<td>'+json[i].Download_DateTime+'</td>'+
      					'<td>'+json[i].photo+'</td></tr>')
      		}  
      	},
      	error : function () {
      		alert('errorrrrr');
      	}
      		});
      		
      		</script>

      [{ “id”:“1”, “名字”:“汤姆”, "lastName": "巡航", "照片": "https://pbs.twimg.com/profile_images/735509975649378305/B81JwLT7.jpg" }, { “id”:“2”, "firstName": "玛丽亚", "lastName": "莎拉波娃", "照片": "https://pbs.twimg.com/profile_images/3424509849/bfa1b9121afc39d1dcdb53cfc423bf12.jpeg" }, { “id”:“3”, “名字”:“詹姆斯”, "lastName": "债券", "照片": "https://pbs.twimg.com/profile_images/664886718559076352/M00cOLrh.jpg" }] `

      URL url=new URL("www.example.com"); 
      
              URLConnection si=url.openConnection();
              InputStream is=si.getInputStream();
              String str="";
              int i;
              while((i=is.read())!=-1){  
                  str +=str.valueOf((char)i);
                  }
      
              str =str.replace("</string>", "");
              str=str.replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", "");
              str = str.replace("<string xmlns=\"http://tempuri.org/\">", "");
              PrintWriter out=resp.getWriter();
              out.println(str);
      

      `

      【讨论】:

        【解决方案8】:

        用下面的代码来做:

        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        
            try {
                DocumentBuilder builder = builderFactory.newDocumentBuilder();
                Document doc = builder.parse("/home/codefelix/IdeaProjects/Gradle/src/main/resources/static/Employees.xml");
                NodeList namelist = (NodeList) doc.getElementById("1");
        
                for (int i = 0; i < namelist.getLength(); i++) {
                    Node p = namelist.item(i);
        
                    if (p.getNodeType() == Node.ELEMENT_NODE) {
                        Element person = (Element) p;
                        NodeList id = (NodeList) person.getElementsByTagName("Employee");
                        NodeList nodeList = person.getChildNodes();
                        List<EmployeeDto> employeeDtoList=new ArrayList();
        
                        for (int j = 0; j < nodeList.getLength(); j++) {
                            Node n = nodeList.item(j);
        
                            if (n.getNodeType() == Node.ELEMENT_NODE) {
                                Element naame = (Element) n;
                                System.out.println("Employee" + id + ":" + naame.getTagName() + "=" +naame.getTextContent());
                            }
                        }
                    }
                }
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        

        }

        【讨论】:

          猜你喜欢
          • 2014-11-17
          • 1970-01-01
          • 2019-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-21
          • 2019-06-21
          相关资源
          最近更新 更多