正在学xml文档的解析
看各种参数没太明白。
请问下,对于这样一个xml片段
- <p1 pair="3">
-   <p2 pair="1">
      <prot>hGITRL</prot> 
    </p2>
  </p1>我怎么依次得到
1、p1这个串(貌似是nodename)
2、pair的值3
3、hGITRl
4、“pair=”这个串;
5、prot以及/prot这两个串
6、/p2以及p1这两个串
7、整体串:<p1 pair="3"><p2 pair="1"><prot>hGITRL</prot></p2></p1>谢谢了

解决方案 »

  1.   

    谢谢
    在网上看了个简单的代码,
    try {
    DocumentBuilder dombuilder=domfac.newDocumentBuilder();
    InputStream is=new FileInputStream("D:\\abstract_for_10074428.xml");
    Document doc=dombuilder.parse(is);
    Element root=doc.getDocumentElement();
    NodeList proteins=root.getChildNodes();
    if(proteins!=null)
    {
    for(int i=0;i<proteins.getLength();i++)
    {
    Node protein=proteins.item(i);
    int temp=proteins.getLength();
    if(protein.getNodeType()==Node.ENTITY_NODE)
    {
    String pairvalue=protein.getAttributes().getNamedItem("pair").getNodeValue();
    System.out.println("pair="+pairvalue);
    for(Node node=protein.getLastChild();node!=null;node=node.getNextSibling())
    {
    if(node.getNodeType()==node.ELEMENT_NODE)
    {
    if(node.getNodeName().equals("prot"))
    {
    String proteinname=node.getFirstChild().getNodeValue();
    System.out.println("protein"+proteinname);
    }
    }

    }
    }
    }

    }
    }
    catch (IOException e)

    {
    System.out.println("file error");

    }
    针对的是简单的xml片段,
    <?xml version="1.0" encoding="gb2312"?>
    <xmlfile>  
    <p1 pair="1">  
       <prot>rjzjh</prot> 
    </p1>
    </xmlfile>
    但是在if(protein.getNodeType()==Node.ENTITY_NODE)
    这句通不过,难道不是判定是ENTITY_NODE 才能进入下一步循环?
      

  2.   

    XML 解析器绝不会解析出“pair=”、“/p2”这种东西出来的。
      

  3.   

    - <p1 pair="2">
    - <prot>
      <p1 pair="1">GITR</p1> 
      ligand 
      </prot>
      </p1>
      ( 
    - <p1 pair="3">
    - <p2 pair="1">
      <prot>hGITRL</prot> 
      </p2>
      </p1>
      ) , and its human receptor ( 
    - <p2 pair="2">
    - <p2 pair="3">
      <prot>hGITR</prot> 
      </p2>
      </p2>
      ) , an ortholog of the recently discovered murine 
    - <prot>
      glucocorticoid - induced TNFR - related ( 
      <prot>mGITR</prot> 
      ) protein 
      </prot>谢谢。其实我的完整文档是这样的,我需要对一篇文档,进行循环的遍历,取出p1或者p2串,以及pair的值,以及根节点的prot
    至于
    - <prot>
      glucocorticoid - induced TNFR - related ( 
      <prot>mGITR</prot> 
      ) protein 
      </prot>
    这种不是我想要的。。ft。。递归的有点头疼啊。
      

  4.   

    我明确点问题,对于一个xml片段:
    - <p1 pair="2">
    - <p1 pair="1">
      <prot>GITR ligand</prot> 
      </p1>
      </p1>
    - <p1 pair="3">
    - <p2 pair="1">
      <prot>hGITRL</prot> 
      </p2>
      </p1>
     <prot>hGITRL</prot> 我需要得到:
    这样一个结构:
    <p1 pair="2">GITR ligand</p1>
    <p1 pair="1">GITR ligand</p1>
    NodeList rootnodes=root.getChildNodes();
    for(int i=0;i<rootnodes.getLength();i++)
    {
    Node nodeitem=rootnodes.item(i);

    if(nodeitem.getNodeType()==Node.ELEMENT_NODE)
    {
    //只对p1或者p2开始的结构进行parse
    if(nodeitem.getNodeName().equals("p1")||nodeitem.getNodeName().equals("p2"))
    {
    for(Node node=nodeitem.getFirstChild(); node!=null; node=node.getNextSibling())
    {
    if(node.getNodeType()==Node.ELEMENT_NODE)
    {
    String pairvalue=node.getAttributes().getNamedItem("pair").getNodeValue();
    String nodename=node.getNodeName().substring(1,2);

    System.out.println("pair="+pairvalue);
    System.out.println(nodename);

    proteinid.pairnum=new Integer(pairvalue).intValue();
    proteinid.pairflag=new Integer(nodename);
    proteinid.proteininfile=filename;


    //只装进去了一个protein
    if(node.getNodeName().equals("prot"))
    {
    String proteinname=node.getFirstChild().getNodeValue();
    System.out.println("protein"+proteinname);

    proteinid.protein=proteinname;

    }


    else
    {
    parseDocumentTree(node, proteinid, filename);
    }

    }
    }

    }

    }

    }
    问题1:不知道这个递归有没有出问题
    问题2:更为重要的是,我每次只能将一个protein装进到proteinid这个数据结构中,因为是树结构如何,解决这个问题了
    谢谢
      

  5.   

    额,将函数做了下修改,请高手看看,样能够循环访问我想要的节点信息吗,谢谢
    //ProteinID是我定义的一个数据结构,包括四个数据:pairflag、pairnum、proteininfile、protein
    //调用函数体 public Hashtable<String, Vector<ProteinID>> buildDocuments() {

    File[] files = (new File(m_fileDir)).listFiles();
    Hashtable<String, Vector<ProteinID>> hs=new Hashtable<String, Vector<ProteinID>>();
    Vector<ProteinID> proteinidver=new Vector<ProteinID>();
    Vector<Vector<String>> tempgetinfo=new Vector<Vector<String>>();
    Vector<String> tempprotein=new Vector<String>();

    try {
    for(File file : files)
    {
    String filename = file.getName(); System.out.print("Reading "+filename+"...");
    InputStream is = new FileInputStream(file.getAbsolutePath());
    Document doc=dombuilder.parse(is);
    Element root=doc.getDocumentElement();
    ProteinID proteinid=new ProteinID();

    for(Node node = root.getFirstChild(); node!=null; node = node.getNextSibling())
    {
    if(node.getNodeType()!=Node.ELEMENT_NODE) continue;
    parseDocumentTree(node, proteinid, filename,tempgetinfo,tempprotein);
    }

    //将收集到的信息进行重新装配
    for(Vector<String> vecitem:tempgetinfo)
    {
    proteinid.pairflag=new Integer(vecitem.get(0)).intValue();
    proteinid.pairnum=new Integer(vecitem.get(1)).intValue();
    proteinid.proteininfile=vecitem.get(3);
    proteinid.protein=tempprotein.get(0);
    }

    proteinidver.add(proteinid);
    hs.put(filename, proteinidver);
    System.out.println("Finished!"); }
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (SAXException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return hs;
    }//递归函数体
    public void parseDocumentTree(Node root, ProteinID proteinid, String filename,Vector<Vector<String>> tempgetinfo,Vector<String> tempprotein )
    {
    NodeList rootnodes=root.getChildNodes();
    for(int i=0;i<rootnodes.getLength();i++)
    {
    Node nodeitem=rootnodes.item(i);

    if(nodeitem.getNodeType()==Node.ELEMENT_NODE)
    {
    //只对p1或者p2开始的结构进行parse
    if(nodeitem.getNodeName().equals("p1")||nodeitem.getNodeName().equals("p2"))
    {
    for(Node node=nodeitem.getFirstChild(); node!=null; node=node.getNextSibling())
    {
    if(node.getNodeType()==Node.ELEMENT_NODE)
    {
    Vector<String> tempvec=new Vector<String>();

    String pairvalue=node.getAttributes().getNamedItem("pair").getNodeValue();
    System.out.println("pair="+pairvalue);
    String nodename=node.getNodeName().substring(1,2);
    System.out.println(nodename);
    System.out.println(filename);

    // proteinid.pairflag=new Integer(nodename).intvalue();
    // proteinid.pairnum=new Integer(pairvalue).intValue();
    // proteinid.proteininfile=filename;
    tempvec.add(nodename);
    tempvec.add(pairvalue);
    tempvec.add(filename);
    tempgetinfo.add(tempvec);



    //只装进去了一个protein
    if(node.getNodeName().equals("prot"))
    {
    String proteinname=node.getFirstChild().getNodeValue();
    System.out.println("protein"+proteinname);
    // proteinid.protein=proteinname;
    tempprotein.add(proteinname);

    }


    else
    {
    parseDocumentTree(node, proteinid, filename,tempgetinfo,tempprotein);
    }

    }
    }

    }

    }

    }
    }