2017-01-14 16 views
2

Я новичок в Java, и я шокирован тем, сколько кода мне нужно получить из двух данных (queryKey и webEnv) из запроса POST. Есть ли более простой или более оптимальный способ сделать то, что я здесь сделал?Есть ли способ упростить сопоставление Java-шаблона для извлечения двух частей данных из запроса POST?

String link = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/epost.fcgi?db=nucleotide&id=" + id; 
    URLConnection connection = new URL(link).openConnection(); 
    connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); 
    connection.connect(); 
    BufferedReader r = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); 

    String webEnv = ""; 
    String queryKey = ""; 

    // Put together string to be scanned to find patterns 
    StringBuilder sb = new StringBuilder(); 
    String line; 
    while ((line = r.readLine()) != null) { 
    sb.append(line); 
    } 
    String result = sb.toString(); 

    // Specify patterns to search for 
    String queryKeyRegEx = "<QueryKey>(\\d+)<\\/QueryKey>"; 
    String webEnvRegEx = "<WebEnv>(\\S+)<\\/WebEnv>"; 

    // Create Pattern objects 
    Pattern queryKeyPattern = Pattern.compile(queryKeyRegEx); 
    Pattern webEnvPattern = Pattern.compile(webEnvRegEx); 

    // Create Matcher objects 
    Matcher queryKeyMatcher = queryKeyPattern.matcher(result); 
    if (queryKeyMatcher.find()) { 
    queryKey = queryKeyMatcher.group(1); 
    System.out.println(queryKey); 
    } 
    Matcher webEnvMatcher = webEnvPattern.matcher(result); 
    if (webEnvMatcher.find()) { 
    webEnv = webEnvMatcher.group(1); 
    System.out.println(webEnv); 
    } 
+1

По внешности вашего запроса, вы делаете HTTP GET запрос о API и синтаксического анализа результата XML. Вы используете стандартные Java-библиотеки, которые, хотя и хорошо, могут потребовать много кода, чтобы заставить их работать. Есть несколько библиотек, которые я мог бы предложить вам использовать, и я могу привести пример, если все в порядке? – phss

+0

Я хотел бы увидеть пример @phss – briennakh

+0

Я бы подключил синтаксический анализатор SAX прямо к входному потоку HTTP-соединения. Но это также займет довольно много строк кода. –

ответ

1

Проверьте это:

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.NodeList; 

import javax.xml.parsers.DocumentBuilderFactory; 
import java.net.URL; 


public class Try { 

    private static Document loadTestDocument(String url) throws Exception { 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     factory.setNamespaceAware(true); 
     return factory.newDocumentBuilder().parse(new URL(url).openStream()); 
    } 

    public static void main(String[] args) throws Exception { 
     Document doc = loadTestDocument("https://eutils.ncbi.nlm.nih.gov/entrez/eutils/epost.fcgi?db=nucleotide&id=1"); 
     NodeList nodeList = doc.getElementsByTagName("ePostResult"); 
     Element element = (Element) nodeList.item(0); 
     String webEnv = element.getElementsByTagName("WebEnv").item(0).getTextContent(); 
     String queryKey = element.getElementsByTagName("QueryKey").item(0).getTextContent(); 
     System.out.println(webEnv); 
     System.out.println(queryKey); 
    } 
} 
0

Java обеспечивает первый класс встроенную поддержку для решения XML документов и называется JAXB. Все, что вам нужно, - создать класс bean-класса с обязательными полями и использовать код, как показано ниже, для отмены маршрутизации из объекта XML в Java.

JAXBContext jc = JAXBContext.newInstance(ePostResult.class); 
XMLInputFactory xif = XMLInputFactory.newFactory(); 
InputStream stream = new ByteArrayInputStream(result.getBytes(StandardCharsets.UTF_8)); 
XMLStreamReader xsr = xif.createXMLStreamReader(stream); 
Unmarshaller unmarshaller = jc.createUnmarshaller(); 
ePostResult ePostResult = (ePostResult) unmarshaller.unmarshal(xsr); 

System.out.println("QueryKey->" + ePostResult.getQueryKey()); 
System.out.println("WebEnv->" + ePostResult.getWebEnv()); 

где вы можете объявить класс компонента:

@XmlRootElement 
public class ePostResult { 
    @XmlElement(name = "QueryKey") 
    String QueryKey; 
    @XmlElement(name = "WebEnv") 
    String WebEnv; 

    public String getQueryKey() { 
     return QueryKey; 
    } 

    public String getWebEnv() { 
     return WebEnv; 
    } 
}