正在学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>谢谢了
看各种参数没太明白。
请问下,对于这样一个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>谢谢了
在网上看了个简单的代码,
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 才能进入下一步循环?
- <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。。递归的有点头疼啊。
- <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这个数据结构中,因为是树结构如何,解决这个问题了
谢谢
//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);
}
}
}
}
}
}
}