2017-01-14 3 views
2

私はJavaに慣れていないので、POSTリクエストから2つのデータ(queryKeywebEnv)を取得するために必要なコードがどれほどのところに驚いています。私がここでやったことをやるためのより簡単で最適な方法がありますか?POSTリクエストから2つのデータを取り出すための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

を、あなたはAPIにHTTP 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

Javaは、XML文書に対処するための最初のクラスの作り付けのサポートを提供し、それがJAXBと呼ばれています。必要なフィールドを持つBeanクラスを作成し、XMLからJavaオブジェクトへアンマーシャリングするために以下のコードを使用するだけです。あなたは、Beanクラスを宣言できる場所

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; 
    } 
} 
関連する問題