以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DOM/SAX/XPath 』  (http://bbs.xml.org.cn/list.asp?boardid=11)
----  [求助]JDOM解析XML的问题?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=11&rootid=&id=41433)


--  作者:rickhunter
--  发布时间:12/20/2006 4:38:00 PM

--  [求助]JDOM解析XML的问题?
xml如下:
<Recon>
<ProvCode>731</ProvCode>
<date>20061221</date>
<Stat>
 <FileCount>3</FileCount>
 <FileList>
  <FileName>stat1.file</FileName>
  <FileName>stat2.file</FileName>
  <FileName>stat3.file</FileName>
 </FileList>
</Stat>
<Monitor>
 <FileCount>4</FileCount>
 <FileList>
  <FileName>Monitor1.file</FileName>
  <FileName>Monitor2.file</FileName>
  <FileName>Monitor3.file</FileName>
  <FileName>Monitor4.file</FileName>
 </FileList>
</Monitor>
</Recon>

解析类为:
package com;

import org.jdom.input.SAXBuilder;
import org.jdom.*;
import java.util.*;
import java.io.IOException;

public class Test1 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO 自动生成方法存根
  SAXBuilder sb=new SAXBuilder(false);
  Document doc = null;
  try {
   doc = sb.build("test.xml");
  } catch (JDOMException e) {
      e.printStackTrace();
  } catch (IOException e) {
      e.printStackTrace();
  }
         Element root=doc.getRootElement(); //获取根元素
         
         Element ProvCodeElement=root.getChild("ProvCode");
         String ProvCode=ProvCodeElement.getText();
         System.out.println("ProvCode:"+ProvCode);
         Element dateElement=root.getChild("date");
         String date=dateElement.getText();
         System.out.println("date:"+date);
         List list=root.getChildren("Stat");
         for(int i=0;i<list.size();i++){
              Element element=(Element)list.get(i);
         
              String FileCount=element.getChildText("FileCount");
              System.out.println("FileCount:"+FileCount);
             
              List list1=element.getChildren("FileList");
              System.out.println("FileListSize:"+list1.size());
              for(int j=0;j<list1.size();j++){
               Element element1=(Element)list1.get(j);
              
               String FileName=element1.getChildText("FileName");
                  System.out.println("FileName:"+FileName);
              }
              
         }
         
         List list2=root.getChildren("Monitor");
         for(int i=0;i<list.size();i++){
              Element element2=(Element)list2.get(i);
         
              String FileCount=element2.getChildText("FileCount");
              System.out.println("FileCount:"+FileCount);
             
              List list3=element2.getChildren("FileList");
             
              for(int j=0;j<list2.size();j++){
               Element element1=(Element)list3.get(j);
              
               String FileName=element1.getChildText("FileName");
                  System.out.println("FileName:"+FileName);
              }
              
         }
         
  }

}


为什么解析结果为:
ProvCode:731
date:20061221
FileCount:3
FileListSize:1
FileName:stat1.file
FileCount:4
FileName:Monitor1.file


--  作者:allrr
--  发布时间:1/11/2007 2:23:00 PM

--  
List list1=element.getChildren("FileList");
for(int j=0;j<list1.size();j++){
               Element element1=(Element)list1.get(j);
               
               String FileName=element1.getChildText("FileName");
                  System.out.println("FileName:"+FileName);
              }
这个循环中,list1.size是1,所以打印的是一行
照你的做法,应该再往下得到filename节点
--  作者:allrr
--  发布时间:1/11/2007 3:00:00 PM

--  
简单点的做法是:
public static void ReadNode(Element el)
{
 List list = el.getChildren();
 if(list.size()!=0)//still has child element
 {
  System.out.println(el.getName());
  for(int i=0;i<list.size();i++)
   ReadNode((Element)list.get(i));
 }
 else
  System.out.println(el.getName()+":"+el.getText());
}

在main()中直接调用 ReadNode(root);


--  作者:kukumaluw
--  发布时间:7/11/2007 11:01:00 AM

--  
明白
--  作者:kukumaluw
--  发布时间:7/11/2007 11:02:00 AM

--  
明白!
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
50.781ms