2017-01-14 8 views
2

저는 Java에 익숙하지 않아 POST 요청에서 두 개의 데이터 (queryKeywebEnv)를 가져와야하는 데 얼마나 많은 코드가 필요한지에 놀랐습니다. 제가 여기서 한 일을하는 더 단순하거나 더 좋은 방법이 있습니까?POST 요청에서 두 가지 데이터를 검색하기 위해 Java 패턴 일치를 단순화하는 방법이 있습니까?

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는 API에 요청을 GET 일을하고, 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

자바 XML 문서를 다루는 최고 수준의 붙박이 지원을 제공하고 JAXB라고합니다. 필요한 필드가있는 빈 클래스를 만들고 아래 코드를 사용하여 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; 
    } 
}