Java 分析从OMIM RESTful Web服务获取的DOM时出错
我是一个网络服务的初学者,可以请任何有经验的人吗 请帮助我完成以下工作: 我正在编写一个客户端,试图从OMIM RESTful web获取信息 服务。我正在使用注册后提供的OMIM密钥。 我成功地获得了与网络的连接 客户另外,通过GET方法,我能够获取所需的数据 转换为DOM文档。此外,我还可以成功地编写整个DOM 输入本地磁盘上的文件。但是,我无法与 DOM使用DOM可用的标准解析函数 例如:我可以使用NodeList获取根节点 nl=doc.getDocumentElement并打印到控制台上。但是当我尝试的时候 要打印根节点的第一个子节点,它将返回null而不是 应为子节点 示例XML表单:webservices->DOM->file 请在下面找到我的代码:Java 分析从OMIM RESTful Web服务获取的DOM时出错,java,web-services,rest,bioinformatics,Java,Web Services,Rest,Bioinformatics,我是一个网络服务的初学者,可以请任何有经验的人吗 请帮助我完成以下工作: 我正在编写一个客户端,试图从OMIM RESTful web获取信息 服务。我正在使用注册后提供的OMIM密钥。 我成功地获得了与网络的连接 客户另外,通过GET方法,我能够获取所需的数据 转换为DOM文档。此外,我还可以成功地编写整个DOM 输入本地磁盘上的文件。但是,我无法与 DOM使用DOM可用的标准解析函数 例如:我可以使用NodeList获取根节点 nl=doc.getDocumentElement并打印到控制台
String path="http://api.omim.org:8000/api/clinicalSynopsis?mimNumber="+"100070"+"&include=clinicalSynopsis&format=xml&apiKey="+"<< xxxxx private key xxxxxxxxxx >> ";
URL url = new URL(path);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
InputStream is = conn.getInputStream();
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = docBuilder.parse(is);
Source src= new DOMSource(doc);
File file = new File("d:/text.xml");
Result rs = new StreamResult(file);
TransformerFactory tmf = TransformerFactory.newInstance();
Transformer trnsfrmr = tmf.newTransformer();
trnsfrmr.transform(src, rs);
System.out.println("XML file is created successfully");
System.out.println("The root element is :: "+doc.getDocumentElement().getNodeName());
NodeList nl=doc.getDocumentElement().getChildNodes();
System.out.println("child nodelist length::"+nl.getLength());
System.out.println("First child node name :: "+doc.getDocumentElement().getFirstChild().getNodeName());
System.out.println("Last child node name :: "+doc.getDocumentElement().getLastChild().getNodeName());
我获得的输出:-XML文件已成功创建根元素为::
omim子节点列表长度::3第一个子节点名称::文本最后
子节点名称::text
在得到的输出中,根节点是“omim”,它有3个子节点。但是
尝试打印第一个和最后一个子名称时返回null。
类似地,getParent、getChild和getSibling方法也不相同
为我工作
我们将非常感谢您的帮助
谢谢,
我发表了一条评论,然后我想我更愿意在回答中进一步解释。您应该询问为什么根有3个子节点。只有一个子元素-clinicalSynopsisList,为什么是3?第一个和最后一个子项是换行符,在clinicalSynopsisList之前和之后可能也有空格。您的节点内容被解释为,因为您没有模式或DTD来告诉解析omni只能包含元素。如果你有,忽略那些不可忽略的东西,就像在书中解释的那样 我已经有一段时间没有直接使用DOM API了,但我不相信您可以要求它提供第一个子元素。相反,您可以使用XPath start,例如,或搜索SO或google以获取示例,以获取第一个子元素,或者使用DOM API迭代子节点并咨询它们的名称,您将忽略它们 我还建议您查看和整理技术,例如,这样您就不必使用从webservice端点读取的原始XML。关于我的回答,我目前无法使用OMIM API,但下面的java代码应该可以完成这项工作。我认为您的问题在于您假设XML节点的第一个子节点是一个元素,这是错误的,它似乎是一个包含回车符的文本节点
import java.net.URLEncoder;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class Biostar44705
{
private static final String API_KEY="XXXXXXXX";
private DocumentBuilder builder;
private Transformer echoTransformer=null;
private Biostar44705()throws Exception
{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
factory.setCoalescing(true);
factory.setIgnoringComments(true);
factory.setNamespaceAware(false);
builder=factory.newDocumentBuilder();
TransformerFactory trf=TransformerFactory.newInstance();
this.echoTransformer =trf.newTransformer();
this.echoTransformer .setOutputProperty(OutputKeys.INDENT, "yes");
this.echoTransformer .setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
}
void get(int omimId)throws Exception
{
String uri="http://api.omim.org:8000/api/clinicalSynopsis?mimNumber="+omimId+
"&include=clinicalSynopsis&format=xml&apiKey="+
URLEncoder.encode(API_KEY,"UTF-8");
Document dom=builder.parse(uri);
Element root=dom.getDocumentElement();
if(root==null) return;
for(Node n1=root.getFirstChild();n1!=null;n1=n1.getNextSibling())
{
if(n1.getNodeType()!=Node.ELEMENT_NODE) continue;
echoTransformer.transform(new DOMSource(n1),new StreamResult(System.out));
break;
}
}
public static void main(String[] args) throws Exception
{
new Biostar44705().get(100070);
}
}
这一条应该有帮助:在biostar上交叉发布:
import java.net.URLEncoder;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class Biostar44705
{
private static final String API_KEY="XXXXXXXX";
private DocumentBuilder builder;
private Transformer echoTransformer=null;
private Biostar44705()throws Exception
{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
factory.setCoalescing(true);
factory.setIgnoringComments(true);
factory.setNamespaceAware(false);
builder=factory.newDocumentBuilder();
TransformerFactory trf=TransformerFactory.newInstance();
this.echoTransformer =trf.newTransformer();
this.echoTransformer .setOutputProperty(OutputKeys.INDENT, "yes");
this.echoTransformer .setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
}
void get(int omimId)throws Exception
{
String uri="http://api.omim.org:8000/api/clinicalSynopsis?mimNumber="+omimId+
"&include=clinicalSynopsis&format=xml&apiKey="+
URLEncoder.encode(API_KEY,"UTF-8");
Document dom=builder.parse(uri);
Element root=dom.getDocumentElement();
if(root==null) return;
for(Node n1=root.getFirstChild();n1!=null;n1=n1.getNextSibling())
{
if(n1.getNodeType()!=Node.ELEMENT_NODE) continue;
echoTransformer.transform(new DOMSource(n1),new StreamResult(System.out));
break;
}
}
public static void main(String[] args) throws Exception
{
new Biostar44705().get(100070);
}
}