2011-06-14 1 views
0

я следующий метод, который вызывает службу POST и возвращает XML, который я хочу поставить атрибуты элемента в HashMapКак я могу очистить следующий метод POST JAVA

Формат XML является:

<?xml version="1.0"?><paul><ncresponse 
atA="14" 
atB="10452775" 
atC="0"> 
</ncresponse></paul> 

метод, который я хочу привести в порядок это:

private HashMap<String, String> myMethod(URL url) throws Exception{ 
    String dataToSend = createUrlParameters(); 
    HttpURLConnection connection = null; 
    HashMap<String, String> keyValues = new HashMap<String, String>(); 

    try { 
     //Create connection 
     connection = (HttpURLConnection)url.openConnection(); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
     connection.setRequestProperty("Content-Length", "" + Integer.toString(dataToSend.getBytes().length)); 
     connection.setRequestProperty("Content-Language", "en-US"); 

     connection.setUseCaches(false); 
     connection.setDoInput(true); 
     connection.setDoOutput(true); 

     //Send request 
     DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); 
     wr.writeBytes(dataToSend); 
     wr.flush(); 
     wr.close(); 

     //Get Response 
     InputStream is = connection.getInputStream(); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
     String line; 
     StringBuffer response = new StringBuffer(); 

     while((line = rd.readLine()) != null) { 
      response.append(line); 
      response.append('\r'); 
     } 

     rd.close(); 

     System.out.println(response.toString()); 

     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     org.xml.sax.InputSource inStream = new org.xml.sax.InputSource(); 
     inStream.setCharacterStream(new java.io.StringReader(response.toString())); 
     Document doc = dBuilder.parse(inStream); 
     doc.getDocumentElement().normalize(); 

     NodeList nList = doc.getElementsByTagName("ncresponse"); 

     for (int temp = 0; temp < nList.getLength(); temp++) { 
      Node nNode = nList.item(temp); 
      if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
       Element eElement = (Element) nNode; 
       NamedNodeMap attrs = eElement.getAttributes(); 
       int len = attrs.getLength(); 
       for (int i=0; i<len; i++) { 
        Attr attr = (Attr)attrs.item(i); 
        //System.out.println(" " + attr.getNodeName() + "=\"" + attr.getNodeValue() + "\""); 
        keyValues.put(attr.getNodeName(), attr.getNodeValue()); 
       } 
      } 
     } 

     return keyValues; 
    } catch (Exception e) { 
     e.printStackTrace(); 

     return null; 
    } finally { 

     if(connection != null) { 
      connection.disconnect(); 
     } 
    } 

заранее спасибо, ребята.

ответ

0

Существует два способа упростить синтаксический анализ XML.

  1. Если у вас есть схемы XML, то, JAXB может сделать XML для преобразования Java.

  2. Вы можете создать класс утилиты для синтаксического анализа пар значений имен, передав ему XML в конструкторе.

Немного не связаны с вашим оригинальным вопросом, но, если вы используете MyMethod() для подключения к нескольким адресам, я бы параллельные вызовы, чтобы ускорить реакцию. Выезд java.util.concurrent.ScheduledExecutorService

0

Прежде всего, ваш метод слишком длинный. Это, вероятно, больше подходит для Code Review, но вам нужно научиться использовать Метод извлечения рефакторинг. Вот что я получил после нескольких бессмысленных кликов:

private Map<String, String> myMethod(URL url) throws Exception { 
    HttpURLConnection connection = null; 

    try { 
     String dataToSend = createUrlParameters(); 
     connection = createConnection(url, dataToSend); 
     sendRequest(dataToSend, connection); 
     return parseResponse(IOUtils.toString(connection.getInputStream())); 
    } finally { 
     if (connection != null) { 
      connection.disconnect(); 
     } 
    } 
} 

private Map<String, String> parseResponse(final String responseXml) throws IOException, ParserConfigurationException, SAXException { 
    Document doc = parseXml(responseXml); 
    return extractAttributes(doc); 
} 

private Map<String, String> extractAttributes(Document doc) { 
    NodeList nList = doc.getElementsByTagName("ncresponse"); 
    Map<String, String> keyValues = new HashMap<String, String>(); 

    for (int temp = 0; temp < nList.getLength(); temp++) { 
     Node nNode = nList.item(temp); 
     if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
      Element eElement = (Element) nNode; 
      NamedNodeMap attrs = eElement.getAttributes(); 
      int len = attrs.getLength(); 
      for (int i = 0; i < len; i++) { 
       Attr attr = (Attr) attrs.item(i); 
       keyValues.put(attr.getNodeName(), attr.getNodeValue()); 
      } 
     } 
    } 

    return keyValues; 
} 

private Document parseXml(String responseXml) throws ParserConfigurationException, SAXException, IOException { 
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
    org.xml.sax.InputSource inStream = new org.xml.sax.InputSource(); 
    inStream.setCharacterStream(new StringReader(responseXml)); 
    Document doc = dBuilder.parse(inStream); 
    doc.getDocumentElement().normalize(); 
    return doc; 
} 

private void sendRequest(String dataToSend, HttpURLConnection connection) throws IOException { 
    IOUtils.copy(new StringReader(dataToSend), connection.getOutputStream()); 
} 

private HttpURLConnection createConnection(URL url, String dataToSend) throws IOException { 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setRequestMethod("POST"); 
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
    connection.setRequestProperty("Content-Length", "" + Integer.toString(dataToSend.getBytes().length)); 
    connection.setRequestProperty("Content-Language", "en-US"); 

    connection.setUseCaches(false); 
    connection.setDoInput(true); 
    connection.setDoOutput(true); 
    return connection; 
} 

Другие изменения:

  • IOUtils класс используется для упрощения ввода/вывода утомительные задачи
  • немного упрощена обработка исключений (ну, на самом деле, удалены)
+0

Спасибо, это здорово. Я прочитаю о рефаторировании метода извлечения – robert

Смежные вопросы