如何使用httpClient来编译Java中的xml文件的一部分

时间:2012-07-01 12:01:05

标签: java xml httpclient pubchem

我目前正在做一个项目,我必须从代​​谢物数据库PubChem请求数据。我正在使用Apache的HttpClient。我正在做以下事情:

HttpClient httpclient = new DefaultHttpClient();
HttpGet pubChemRequest = new HttpGet("http://pubchem.ncbi.nlm.nih.gov/summary/summary.cgi?cid="
    + cid + "&disopt=SaveXML");
pubChemRequest.getAllHeaders();
System.out.println(pubChemRequest);
HttpResponse response = null;
response = httpclient.execute(pubChemRequest);
HttpEntity entity = response.getEntity();
pubChemInchi = EntityUtils.toString(entity);

问题是此代码流式传输整个XML文件:

<?xml version="1.0"?>
<PC-Compound
xmlns="http://www.ncbi.nlm.nih.gov"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation="http://www.ncbi.nlm.nih.gov ftp://ftp.ncbi.nlm.nih.gov/pubchem/specifications/pubchem.xsd">

我想要的是我可以请求例如PubChem ID,它会粘贴与该ID对应的值。我发现这可以使用本机Java方法完成,但我需要使用HttpClient。 使用本机Java,可以这样做:

cid = 5282253
reader = new PCCompoundXMLReader(
new URL("http://pubchem.ncbi.nlm.nih.gov/summary/summary.cgi?cid=" + cid + "&disopt=SaveXML").newInputStream())
mol = reader.read(new NNMolecule())
println "CID: " + mol.getProperty("PubChem CID")

(注意:这段代码是用Groovy编写的,但经过一些调整后它也适用于Java)

所以,如果有人能帮助我,那就太棒了:)。

2 个答案:

答案 0 :(得分:1)

有多种方法可以做到这一点。

如果你想将响应转换为bean并且不希望响应的结构发生变化,我会考虑使用XStream。 另一种选择是直接使用SAX解析器。

当然,快速而肮脏的方法是将您的响应内容转换为bufferedReader。然后将该阅读器提供给您正在使用的XMLReader。

使用上面代码的示例是:

HttpClient httpclient = new DefaultHttpClient();
HttpGet pubChemRequest = new HttpGet("http://pubchem.ncbi.nlm.nih.gov/summary/summary.cgi?cid="
    + cid + "&disopt=SaveXML");
pubChemRequest.getAllHeaders();
System.out.println(pubChemRequest);
HttpResponse response = null;
response = httpclient.execute(pubChemRequest);
BufferedReader br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())));
cid = 5282253
reader = new PCCompoundXMLReader(br)
mol = reader.read(new NNMolecule())
println "CID: " + mol.getProperty("PubChem CID")

搜索RESTful Web服务客户端或XMLReader应该为您提供有关此主题的更多信息

答案 1 :(得分:0)

尝试使用 NameValuePair

例如:

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);

nameValuePairs.add(new BasicNameValuePair("username", user123));

nameValuePairs.add(new BasicNameValuePair("password", pass123));

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

HttpResponse response = httpclient.execute(httppost);