`
sillycat
  • 浏览: 2488213 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

ftp client的开源实现

    博客分类:
  • JAVA
阅读更多
HTML解析htmlparser

htmlparser
首页:http://sourceforge.net/projects/htmlparser/
下载:http://sourceforge.net/project/showfiles.php?group_id=24399
文件:HTMLParser-2.0-SNAPSHOT-bin.zip

cpdetector
首页:http://cpdetector.sourceforge.net/
下载:http://sourceforge.net/project/showfiles.php?group_id=114421
文件:cpdetector_eclipse_project_1.0.7.zip

解开压缩后,运行ANT打包命令,build.xml有些地方需要稍微根据具体情况调整一下
ant jar.htmlentitydecoder
得到JAR包
cpdetector_1.0.7.jar

HTML工具类函数一:自动探测URL的HTML内容的编码

/**
* 自动探测页面的编码
*
* @param url
* @return
* @throws MalformedURLException
*/
public static String autoDetectCharset(String url) {
   URL source = null;
   try {
    source = new URL(url);
   } catch (MalformedURLException e) {
    log.error(e);
   }
   CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
   detector.add(new ParsingDetector(false));
   detector.add(JChardetFacade.getInstance());
   detector.add(ASCIIDetector.getInstance());
   detector.add(UnicodeDetector.getInstance());

   Charset charset = null;
   try {
    charset = detector.detectCodepage(source);
   } catch (IOException e) {
    log.error(e);
   }

   if (charset == null) {
    charset = Charset.defaultCharset();
   }
   return charset.name();
}

HTML工具类函数二:读取URL中的HTML文本
/**
* 读取文件HTML内容
*
* @param url
* @param charset
* @return
* @throws IOException
*/
public static String readURL(String url, String charset) {
   /* StringBuffer的缓冲区大小 */
   int TRANSFER_SIZE = 4096;

   /* 当前平台的行分隔符 */
   String lineSep = System.getProperty("line.separator");

   String content = "";
   URL source = null;
   try {
    source = new URL(url);
   } catch (MalformedURLException e) {
    log.error(e);
   }
   InputStream in = null;
   try {
    in = source.openStream();
   } catch (IOException e) {
    log.error(e);
   }
   BufferedReader reader = null;
   try {
    reader = new BufferedReader(new InputStreamReader(in, charset));
   } catch (UnsupportedEncodingException e) {
    log.error(e);
   }
   String line = new String();
   StringBuffer temp = new StringBuffer(TRANSFER_SIZE);
   try {
    while ((line = reader.readLine()) != null) {
     temp.append(line);
     temp.append(lineSep);
    }
    in.close();
    reader.close();
   } catch (IOException e) {
    log.error(e);
   }
   content = temp.toString();
   return content;
}

HTML工具类函数三:解析HTML得到其中的所有TAG
public static NodeList getFormNodeList(String url) {
   Parser parser = Parser.createParser(readURL(url),
     autoDetectCharset(url));
   PrototypicalNodeFactory factory = new PrototypicalNodeFactory();
   factory.registerTag(new ScclSelectBizCodesTag());
   factory.registerTag(new InputTag());
   factory.registerTag(new TextareaTag());
   parser.setNodeFactory(factory);

   NodeFilter formFilter = new PostFormFilter();

   NodeList nodeList = null;
   try {
    nodeList = parser.extractAllNodesThatMatch(formFilter);
   } catch (ParserException e) {
    log.error(e);
   }
   return nodeList;
}

HTML工具类函数四:解析TAG中的属性,生成所有的PageField的POJO
public static List<PageField> getPageFields(String url) {
   List<PageField> list = null;
   NodeList nodeList = getFormNodeList(url);
   if (nodeList != null && nodeList.size() > 0) {
    // nodeList不为空,开始构建
    list = new ArrayList<PageField>(nodeList.size());
    for (int i = 0; i < nodeList.size(); i++) {
     TagNode node = (TagNode) nodeList.elementAt(i);
     if (node instanceof InputTag) {
      InputTag input = (InputTag) node;
      PageField t = new PageField(input.getAttribute("name"),
        PageField.TAG_TYPE_INPUT, input
          .getAttribute("type"));
      list.add(t);
     } else if (node instanceof ScclSelectBizCodesTag) {
      ScclSelectBizCodesTag scclSelectBizCodesTag = (ScclSelectBizCodesTag) node;
      PageField t = new PageField(scclSelectBizCodesTag
        .getAttribute("id"),
        PageField.TAG_TYPE_SELECT, null);
      list.add(t);
     } else if (node instanceof TextareaTag) {
      TextareaTag textArea = (TextareaTag) node;
      PageField t = new PageField(textArea.getAttribute("name"),PageField.TAG_TYPE_TEXTAREA,null);
      list.add(t);
     }
    }
   }
   return list;
}

扩展自定义标签<sccl:selectBizCodes>
public class ScclSelectBizCodesTag extends TagNode {
private static final long serialVersionUID = -6352090777443844707L;
private static final String[] ids = new String[] { "sccl:selectBizCodes" };
public String[] getIds() {
   return (ids);
}
public String[] getEnders() {
   return (ids);
}
public String getCategory(){
   return super.getAttribute("category");
}
public String getId(){
   return super.getAttribute("id");
}
public String getSelected(){
   return super.getAttribute("selected");
}
}

用FILTER方式过滤访问TAG
public class PostFormFilter implements NodeFilter {
private static final long serialVersionUID = 8162322553987269165L;
public boolean accept(Node node) {
   if (node instanceof InputTag) {
    return true;
   }
   if (node instanceof ScclSelectBizCodesTag) {
    return true;
   }
   if (node instanceof TextareaTag) {
    return true;
   }
   return false;
}
}

测试
public static void main(String[] args)
    throws org.htmlparser.util.ParserException, IOException {
   String url = "file:///E:\\work\\html\\editOrder.jsp";
   List<PageField> list = getPageFields(url);
   list.get(0);
}

以上代码可以解析<input> <select> 自定义类型
<sccl:selectBizCodes category="worksheet" id="worksheetCode" selected="cl" onChange="go();" html="style='test';"/>

问题一
拷贝cpdetector_1.0.7.jar到项目中后
同时也要拷贝ext下面的chardet.jar到lib下面,不然在调用
detector.add(JChardetFacade.getInstance());时要报错,找不到类
nsICharsetDetectionObserver

问题二
拷贝htmlparser相关包如下:
htmlparser.jar
htmllexer.jar
分享到:
评论

相关推荐

    FileZilla FTP Client

    FileZilla FTP Client 开源的软件,完全免费,纯绿色,比市面上大部分ftp软件好用

    android 开源库上传FTP

    开源库的包名是这个org.apache.commons.net.ftp.FTPClient;是属于局域网的ftp上传,要有ip、端口、用户名以及密码。我根据网上的下载demo,自已研究了一番,又封装了一个类自已使用。欢迎访问博客:...

    前端开源库-ftp-client

    前端开源库-ftp-clientftp客户机,节点ftp模块的包装器

    The FTP Client-开源

    一个简单的FTP客户端。

    基于lwip的ftp客户端代码

    基于ucos系统通过lwip实现ftp客户端功能,用于从服务器下载升级程序少些片上flash

    FileZilla FTP Client.rar

    FileZilla是一个免费开源的FTP客户端软件,分为客户端版本和服务器版本,具备所有的FTP软件功能。可控性、有条理的界面和管理多站点的简化方式使得Filezilla客户端版成为一个方便高效的FTP客户端工具。

    tftp-ftp开源软件

    开源软件,支持tftp和ftp server端、client端,方便用户进行文件上传和下载

    FileZilla FTP Client.zip

    FileZilla FTP Client 是一个个免费开源的FTP软件 具备所有的FTP软件功能。可控性、有条理的界面和管理多站点的简化方式使得Filezilla客户端版成为一个方便高效的FTP客户端工具

    Yet Another FTP Client-开源

    Yafc是一个开放源代码控制台模式FTP客户端。 它支持Kerberos 4/5身份验证和sftp(ssh2)。 其他功能包括制表符完成,目录缓存,强大的别名,递归文件命令和具有自动登录功能的书签。

    Python FTP Client-开源

    一个用Python编写的用户友好,菜单驱动的FTP客户端。

    FTP客户端C源码(Linux版)

    N年前写的FTP客户端,练习程序,支持常用命令,支持PASV与PORT模式 对应的服务器端为: http://download.csdn.net/source/2724443

    PHP FTP CLIENT-开源

    PHP FTP CLIENT是ftp客户端,它通过HTTP接口运行。

    MatzSoft Java FTP-Client-开源

    MJftp是使用纯Java编写的开源多平台ftp客户端。

    Ultra Light FTP Client-开源

    Ftp 客户端控制台应用程序设计用于资源有限的设备,如 Windows CE。 实现常见的ftp功能以及一些额外的功能,例如批量上传/下载文件。 它应该适用于大多数 Windows CE 平台和普通 Windows。

    ftp 客户端实现

    用edtftpj.jar 实现的ftp client edtFTPj是一个非常强大的FTP组件,有Java版本、.NET版本、JavaScript版本。  Java版本的有收费的edtFTPj/PRO,还有免费开源的edtFTPj/Free。  这里使用edtFTPj/Free。  ...

    FtpGUI - Swing Ftp Client-开源

    这个项目打算给大家用Java编写的ftp客户端。 当前,FtpGUI实现了常用功能。 获取-RETR检索ftp服务器上的文件列表文件,放置-STOR-上传文件,然后搜索名称

    .Net FTP Client-开源

    这是FTP客户端协议的纯.Net实现。 它旨在同时在Microsoft的.Net CLR和Mono CLR中运行。

    Perl FTP Client-开源

    这是一个用Perl编写的小型FTP客户端,它打算在终端中使用。 根据GNU GPL V3许可证发布的软件。

Global site tag (gtag.js) - Google Analytics