我有一批机器(Client), 机器的名称都在一个目录下的XX.xml文件的<device>.......<device>之中。正在写一个传文件的程序,Server需要知道Client机器的名称(从Client传过来),如何用JAVA将它们读出来存入String之中???
    在线等,多谢.......

解决方案 »

  1.   

    http://developer.51cto.com/art/200903/117512.htm
      

  2.   

    楼主是要解析xml文件。
    我都是用jdom来解析的import org.jdom.input.SAXBuilder;SAXBuilder builder = new SAXBuilder();
    Document doc = builder.build($file);
    Element xx= doc.getRootElement(); String device= user.getAttributeValue("device"); 
      

  3.   

    直接用 Javabean里的的一些 XMLDecoder XMLEncoder 就可以方便的的进行一些
    简单的XML写出和读入功能 
    说多无异 楼主把我的代码拿去 体验一下 就会明白
    如果符合需求就深入研究一些这两个类 如果不符合就当学习了import java.beans.XMLDecoder;
    import java.beans.XMLEncoder;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;

    class ObjectToXMLUtil 

     /** 
      * 把java的可序列化的对象(实现Serializable接口)序列化保存到XML文件里面,如果想一次保存多个可序列化对象请用集合进行封装 
      * 保存时将会用现在的对象原来的XML文件内容 
      * @param obj 要序列化的可序列化的对象 
      * @param fileName 带完全的保存路径的文件名  
      * @throws FileNotFoundException 指定位置的文件不存在 
      * @throws IOException 输出时发生异常 
      * @throws Exception 其他运行时异常 
      */ 
     public static void objectXmlEncoder(Object obj,String fileName) 
      throws FileNotFoundException,IOException,Exception 
     {   
      //创建输出文件 
      File fo = new File(fileName); 
      //文件不存在,就创建该文件 
      if(!fo.exists()) 
      { 
       //先创建文件的目录 
          String path = fileName.substring(0,fileName.lastIndexOf('.')); 
          File pFile = new File(path); 
          pFile.mkdirs();          
      } 
      //创建文件输出流 
      FileOutputStream fos = new FileOutputStream(fo); 
      //创建XML文件对象输出类实例 
      XMLEncoder encoder = new XMLEncoder(fos);   
      //对象序列化输出到XML文件 
      encoder.writeObject(obj); 
      encoder.flush();  
      //关闭序列化工具 
      encoder.close(); 
      //关闭输出流 
      fos.close();     
     }  
     /** 
      * 读取由objSource指定的XML文件中的序列化保存的对象,返回的结果经过了List封装 
      * @param objSource 带全部文件路径的文件全名 
      * @return 由XML文件里面保存的对象构成的List列表(可能是一个或者多个的序列化保存的对象)   
      * @throws FileNotFoundException 指定的对象读取资源不存在 
      * @throws IOException 读取发生错误 
      * @throws Exception 其他运行时异常发生 
      */ 
     public static List objectXmlDecoder(String objSource)  
      throws FileNotFoundException,IOException,Exception 
     { 
      List objList = new ArrayList();     
      File fin = new File(objSource); 
      FileInputStream fis = new FileInputStream(fin); 
      XMLDecoder decoder = new XMLDecoder(fis); 
      Object obj = null; 
      try 
      { 
       while( (obj = decoder.readObject()) != null) 
       { 
        objList.add(obj); 
       } 
      } 
      catch (Exception e) 
      { 
       // TODO Auto-generated catch block     
      } 
      fis.close(); 
      decoder.close();      
      return objList; 
     } 
    }
      

  4.   

    dom4j这个工具比java自己带的xml的工具类好用..
      

  5.   

    在J2SE5.0的API中我怎么找不到org.jdom这个包呀!!
      

  6.   

    Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。在java的api中没有,你从网上下个dom4j.jar吧
      

  7.   


    package beans;import java.io.File;
    import java.util.List;import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Node;
    import org.dom4j.io.SAXReader;public class Dom4jTest { /**
     * @param args
     */
    public static void main(String[] args) { try {
    SAXReader reader = new SAXReader();   
     File file = new File("src/hibernate.cfg.xml");
     Document doc = reader.read(file);
         
     List childNodes = doc.selectNodes("//device");  
     System.out.println(childNodes.size());
     for(Object obj:childNodes) {     
     Node childNode = (Node)obj;  
     String s = childNode.asXML();
     System.out.println("childNode============"+s);
         
     }  
    }catch (DocumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }   }
    }我给你写了下,在我这测试通过,你改成你自己的文件试下看看行不行。改得地方我用红色给你显示出来了
      

  8.   

     File file = new File("src/hibernate.cfg.xml");
    不好意思,本想在代码中给改成红色,可是没有成功。嘿嘿
      

  9.   

       非常谢谢!!!!!!!
       还想问,几十台机器都装dom4j.jar工作量很大 ,也占用宝贵资源,有没有别的办法??利用JAVA-API现有的类......只要把devideno读出来就行
       非常谢谢!!!!!!!
      

  10.   

    这个不需要装的,你只要把dom4j。jar拷贝到你工程的web-inf/lib下就好了。听方便的。还有这东西很小,应该不会占用你多大的资源吧
      

  11.   

    http://www.cnblogs.com/yiki/archive/2007/07/23/828562.html
      

  12.   

    http://blog.csdn.net/aboykoy/archive/2008/03/16/2187967.aspx
      

  13.   

       利用JAVA-API现有的类......只要把devideno读出来就行 ,能实现吗??
        thanks.....
      

  14.   

    我不明白你的意思。就是要取得xml里面的<device>....... <device>间的值?
    那那么麻烦干什么?我机器上没java,大概写写,看个大意吧。import java.io.*;
    public class DeviceHelper
    {
      public String getDevice()
      {
        char data[]=new char[1024]; 
    try{
        FileReader fr=new FileReader("...xml"); 
        int num=fr.read(data); 
        String str=new String(data,0,num); 
    int start = str.indexOf("<device>")+1;
    int end = str.indexOf("</device>");
    String device = str.subStr(start,end);
    return device;
       }catch(...){
    }finally{
       fr.close();
    }
    }
    }大概看看吧,具体的api记不住你把xml全部读出来,然后简单找到返回,不就可以了吗?
      

  15.   

    我那个回复下面内容不对的:FileReader fr=new FileReader("...xml"); 
    int num=fr.read(data); 
    String str=new String(data,0,num); 我随便找了个读文件的源码拷贝过来修改的。没注意看。请换成把文件全部读到一个String的方法。
      

  16.   

    17楼 你的方法我看了 我的XML文件内容较多 读出来放入String 这个STRING要多长啊!!
    再说哪有这样的方法呢??
    谢谢,我已很受启发了!!
      

  17.   

    这样啊,你的xml文件分行正常的吧?如果正常,很容易解决。你可以一行一行读进来,然后判断这行是不是<device>(.)+</device>的,如果不是的话就continue;如果是的话,就把这行读成String,直接像上面的那样选取然后返回一行一行读文件,好像BufferedReader有个readLine吧?
      

  18.   

    jdom是个第三方做的包,你要另外下载的。jdom的包放到你执行xml操作的机器上就行,目的就是用它来处理其他机器上的xml文件嘛。java自己的包也能做xml的解析,不过不好用。还是用jdom吧。现在大家都用这个。