Java 分析从OMIM RESTful Web服务获取的DOM时出错

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并打印到控制台

我是一个网络服务的初学者,可以请任何有经验的人吗 请帮助我完成以下工作:

我正在编写一个客户端,试图从OMIM RESTful web获取信息 服务。我正在使用注册后提供的OMIM密钥。 我成功地获得了与网络的连接 客户另外,通过GET方法,我能够获取所需的数据 转换为DOM文档。此外,我还可以成功地编写整个DOM 输入本地磁盘上的文件。但是,我无法与 DOM使用DOM可用的标准解析函数

例如:我可以使用NodeList获取根节点 nl=doc.getDocumentElement并打印到控制台上。但是当我尝试的时候 要打印根节点的第一个子节点,它将返回null而不是 应为子节点

示例XML表单:webservices->DOM->file

请在下面找到我的代码:

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);
    }
}