Java HTMLParser使用详解
- 格式:doc
- 大小:294.00 KB
- 文档页数:26
parser用法Parser 是一种工具或库,用于解析输入数据并将其转换为计算机可理解的结构化形式。
它通常用于处理文本数据,如配置文件、日志文件、标记语言(如XML或HTML)、数据交换格式(如JSON)等。
Parser可以按照特定的语法规则将输入解析为语法树或抽象语法树(AST),并将其用于进一步的处理、分析或转换。
它可以识别和提取特定的数据或信息,并将其用于后续的操作。
对于不同类型的数据,通常需要使用不同的Parser。
例如,对于XML数据,可以使用XML Parser解析器;对于JSON数据,可以使用JSON Parser解析器。
一些流行的编程语言和框架也提供了自己的Parser,用于解析特定格式的数据。
Parser的使用方法通常涉及以下几个步骤:1. 导入或引入所需的Parser库或模块。
2. 创建Parser对象,并根据需要配置其参数和选项。
3. 使用Parser对象解析输入数据,将其转换为特定的数据结构。
4. 根据需要对解析后的数据进行进一步处理或操作。
例如,在Python中,可以使用内置的json模块来解析JSON数据:```pythonimport json# 定义JSON格式的字符串json_str = '{"name": "John", "age": 30, "city": "New York"}'# 解析JSON字符串parsed_data = json.loads(json_str)# 输出解析后的数据print(parsed_data["name"])print(parsed_data["age"])print(parsed_data["city"])```这段代码通过json.loads()函数将JSON格式的字符串解析为Python字典,并可以通过键访问解析后的数据。
javaparser 介绍JavaParser 介绍JavaParser 是一个用于解析Java 代码的开源库,它可以将Java 代码转化为一个抽象语法树(AST)。
AST 是一种树形结构,它反映了代码的结构和组织方式,可以用于代码分析、代码生成和重构等多种用途。
JavaParser 提供了一系列的API,使得开发者可以方便地遍历和操作AST。
一、JavaParser 的安装与配置1. 获取JavaParserJavaParser 可以从Maven 仓库中获取,可以通过添加以下依赖项到项目的pom.xml 文件来引入JavaParser:<dependency><groupId>com.github.javaparser</groupId><artifactId>javaparser-core</artifactId><version>3.26.0</version></dependency>2. 创建JavaParser 对象要使用JavaParser,你需要创建一个JavaParser 对象。
通常情况下,你只需要创建一个JavaParser 对象即可,因为它是线程安全的。
你可以通过以下方式创建一个JavaParser 对象:JavaParser javaParser = new JavaParser();二、解析Java 代码JavaParser 提供了多个方法来解析Java 代码。
以下是最常用的两种方法:1. Parse 方法JavaParser 的parse 方法可以将一个文件或一个代码片段解析为AST。
它接受一个输入流或一个字符串作为参数,并返回一个CompilationUnit 对象,该对象表示整个Java 文件。
CompilationUnit cu = javaParser.parse(newFileInputStream("path/to/YourClass.java"));或String code = "class YourClass {}";CompilationUnit cu = javaParser.parse(code);2. ParseBody 方法除了parse 方法之外,JavaParser 还提供了parseBody 和parseExpression 方法,它们可以将指定的Java 代码解析为AST 中的BodyDeclaration 和Expression 对象。
html pattern用法HTML Pattern是一种HTML5中引入的新特性,它可以用于限制用户输入在表单控件中的数据格式。
通过轻松设置模式匹配规则,开发人员可以控制用户输入的数据格式,从而降低表单数据的错误率,提高应用程序的可用性。
HTML Pattern使用正则表达式作为模式匹配规则,可以使用各种元字符和修饰符来定义各种模式,例如日期格式、邮箱格式、电话号码格式等。
在HTML表单元素中,可以使用pattern属性来指定模式匹配规则。
当用户试图提交表单时,浏览器会自动检查表单数据是否符合规则,如果不符合则会提示用户相应的错误信息。
下面是一个简单的例子,演示如何使用HTML Pattern限制用户输入邮箱格式:```html<form><label for="email">邮箱地址:</label><input type="email" id="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" required><input type="submit" value="提交"></form>```在上面的例子中,使用了type="email"属性来指定输入框类型为电子邮件地址,使用了pattern属性来指定模式匹配规则。
在模式规则中,我们使用了正则表达式来匹配符合标准的邮箱地址。
此外,我们还使用了required属性来要求用户必须填写此项内容。
除了邮箱地址之外,HTML Pattern还可以用于限制其他数据格式,例如电话号码、网址、日期等等。
下面是一些模式匹配规则的示例:- 电话号码:pattern="[0-9]{3}-[0-9]{8}"- 网址:pattern="(https|http)://([A-Za-z0-9.-/]+)"- 日期:pattern="\d{4}-\d{2}-\d{2}"需要注意的是,HTML Pattern虽然可以有效地控制用户输入的数据格式,但并不能完全代替服务器端的表单数据验证。
javaparser代码树解析标题,深入理解JavaParser,代码树解析。
正文:JavaParser是一个流行的Java语言解析库,它可以帮助开发人员分析和操作Java代码。
其中一个重要的功能就是代码树解析,它可以让开发人员深入了解代码的结构和细节,从而进行各种代码分析和操作。
本文将介绍JavaParser代码树解析的原理和应用。
代码树解析是指将Java源代码解析成一个树状结构,每个节点代表代码的一个部分,例如类、方法、变量等。
通过这种树状结构,我们可以轻松地遍历和操作代码,实现诸如代码生成、重构、静态分析等功能。
JavaParser提供了丰富的API来进行代码树解析。
首先,我们可以使用Parser对象将源代码解析成一个CompilationUnit对象,它代表了整个源文件的代码树。
然后,我们可以通过Visitor模式遍历这个代码树,对每个节点进行操作。
例如,我们可以编写一个Visitor来查找所有的方法定义,或者找出所有的变量声明。
除了遍历代码树,JavaParser还提供了一些方便的方法来操作代码树。
例如,我们可以使用Node的getParent方法来获取某个节点的父节点,使用Node的getChildNodes方法来获取所有子节点。
这些方法可以帮助我们更方便地进行代码分析和操作。
代码树解析在实际开发中有着广泛的应用。
例如,我们可以利用代码树解析来实现自动化重构工具,例如提取方法、内联方法等。
我们还可以利用代码树解析来实现静态分析工具,例如查找代码中的bug、优化代码结构等。
此外,代码树解析还可以用于生成代码,例如自动生成代码文档、自动生成测试用例等。
总之,JavaParser的代码树解析功能为开发人员提供了强大的工具,帮助他们更好地理解和操作Java代码。
通过深入理解JavaParser的代码树解析,我们可以提高代码分析和操作的效率,从而提高软件开发的质量和效率。
在Java编程中,需要对源代码进行解析和操作时,通常会使用javaparser这个开源工具。
javaparser是一个用于解析、分析、修改和生成Java源代码的工具库,能够帮助开发者轻松地对Java代码进行各种操作。
本文将介绍如何在javaparser中添加方法。
二、准备工作在使用javaparser添加方法之前,需要进行一些准备工作:1. 导入javaparser库:在项目中引入javaparser库,可以通过Maven或Gradle等构建工具来添加依赖。
2. 加载源代码:使用javaparser提供的工具类,将源代码加载到内存中进行解析和操作。
三、添加方法接下来,我们将介绍在javaparser中如何添加方法。
1. 解析源代码:需要使用javaparser来解析源代码,将其转换为抽象语法树(AST)的形式,以便进行后续的操作。
2. 创建新方法:在解析完成后,可以通过javaparser提供的API来创建一个新的方法节点,设置方法的修饰符、返回类型、方法名、参数列表和方法体等信息。
3. 添加至类体:将创建的新方法节点添加到目标类的类体中,即将新方法插入到AST中的相应位置。
4. 生成代码:将AST转换回源代码的形式,即可得到添加方法后的新四、示例代码下面是一个简单的示例代码,演示了如何使用javaparser添加方法:```java// 加载源代码CompilationUnit cu = JavaParser.parse(newFile("HelloWorld.java"));// 获取要操作的类ClassOrInterfaceDeclaration targetClass =cu.getClassByName("HelloWorld").get();// 创建新方法MethodDeclaration newMethod = new MethodDeclaration(EnumSet.of(Modifier.PUBLIC), ASTHelper.VOID_TYPE, "sayHello");newMethod.setParameters(ASTHelper.createParameter(ASTHelp er.createReferenceType("String", 0), "name"));BlockStmt methodBody = new BlockStmt();methodBody.addStatement(new ExpressionStmt(new MethodCallExpr(new NameExpr("System.out"), "println", ASTHelper.createArgument(ASTHelper.createBinaryExpr(new NameExpr("name"), new StringLiteralExpr("Hello, "), BinaryExpr.Operator.PLUS))));newMethod.setBody(methodBody);// 将新方法添加至类体targetClass.getMembers().add(newMethod);// 生成代码String newCode = cu.toString();```五、总结通过以上步骤,我们可以在javaparser中轻松地添加方法,而无需手动操作源代码。
HTMLParser、Java、MySQL字符编码以及乱码解决--2013-9-20 16:18:11在使用HTMLParser、Java、MySQL进行网页抓取,并解析网页,存进数据库时,经常会出现中文乱码、中文破折号显示成问号“?”、或者更猛烈些就是插入数据库失败。
在此根据我的个人经验以及网友的总结,写出这篇文章,以给出解决方案:首先,我们来了解下大概原因:1、GB2312不支持中文破折号“——”,而GBK支持中文破折号,UTF-8支持几乎所有字符。
在将UTF-8,或者GBK转换为GB2312时,破折号显示会出错,这属于有损转换。
2、客户机没有正确地设置client字符集,导致原先的SQL语句被转换成connection所指字符集,而这种转换,是会丢失信息的,如果client是utf8格式,那么如果转换成gb2312格式,这其中必定会丢失信息,反之则不会丢失。
一定要保证connection的字符集大于client 字符集才能保证转换不丢失信息。
3、数据库编码没有设置正确,如果数据库编码设置不正确,那么connection字符集转换成database字符集照样丢失编码,原因跟上面一样。
针对以上问题,解决方案如下:1、修改MySQL的编码设置,在my.ini或者f中修改这两个参数:[mysql]default-character-set=utf8[mysqld]character-set-server=utf8如果更改MySQL配置文件my.ini的编码属性并重启mysql的服务之后,导致插入数据失败时,则可以删除该数据库(注意:数据库,而不只是表)。
然后重建数据库和表,就可以插入了。
2、jdbc编码与MySQL编码的不同,同样会造成数据乱码或者插入失败。
解决这个问题的方法就是在进行数据库处理之前将你的数据编码修改为数据库的编码格式。
使用String的getByte()方法首先获取字节数据,然后再使用String的构造方法将字节数据转换为同mysql 一样的编码格式的String。
java中parse的用法
parse是java中的一个重要概念,它可以帮助开发者将字符串转换为其他类型的数据,从而实现数据的转换和处理。
parse在java中有两种用法,一种是将字符串转换为基本数据类型,另一种是将字符串转换为对象。
首先,将字符串转换为基本数据类型。
java中提供了一系列的parse 方法,可以将字符串转换为基本数据类型,比如Integer.parseInt()可以将字符串转换为整型,Double.parseDouble()可以将字符串转换为双精度浮点数,Boolean.parseBoolean()可以将字符串转换为布尔值等。
其次,将字符串转换为对象。
java中提供了一系列的parse方法,可以将字符串转换为对象,比如DateFormat.parse()可以将字符串转换为日期对象,NumberFormat.parse()可以将字符串转换为数字对象,DecimalFormat.parse()可以将字符串转换为小数对象等。
parse在java中的应用非常广泛,它可以帮助开发者将字符串转换为其他类型的数据,从而实现数据的转换和处理。
parse的使用可以大大提高开发效率,减少开发时间,提高开发质量。
总之,parse是java中一个重要的概念,它可以帮助开发者将字符串转换为其他类型的数据,从而实现数据的转换和处理。
parse的使用可以大大提高开发效率,减少开发时间,提高开发质量,是java开发中不可或缺的一部分。
javaparser 介绍【原创版】目录1.JavaParser 简介2.JavaParser 的功能3.JavaParser 的使用示例4.JavaParser 的优势与不足正文1.JavaParser 简介JavaParser 是一个用于解析 Java 源代码的开源库。
它可以将 Java 源代码解析成抽象语法树(Abstract Syntax Tree,AST),从而方便开发者对代码进行分析、生成、重构等操作。
JavaParser 本质上是一个 Java 语言的词法分析器和语法分析器,它遵循 Java 语言的语法规范,将源代码转换成结构化的数据模型。
2.JavaParser 的功能JavaParser 具有以下主要功能:- 将 Java 源代码解析成抽象语法树(AST)- 支持 Java 5、Java 6、Java 7 和 Java 8 等多个版本的语法规范- 可以解析类、方法、变量、注释等各种 Java 语言结构- 支持自定义词法分析器和语法分析器3.JavaParser 的使用示例下面是一个简单的 JavaParser 使用示例:```javaimport JavaParser.ParserFactory;import JavaParser.ast.AST;import pilationUnit;public class Main {public static void main(String[] args) {try {ParserFactory factory =ParserFactory.newFactory();CompilationUnit unit = factory.create(new FileReader("test.java"));AST ast = unit.parse();System.out.println(ast.toStringTree(ast.getRoot()));} catch (Exception e) {e.printStackTrace();}}}```在这个示例中,我们首先创建一个 ParserFactory 实例,然后使用该实例创建一个 CompilationUnit 对象。
使⽤HtmlParser解析HTML(C#版)本⽂介绍了.net 版的⼀个HTMLParser⽹页解析开源类库(Winista.HTMLParser)的功能特性、⼯作原理和使⽤⽅法。
对于使⽤.net进⾏Web信息提取的开发⼈员进⾏了⼀次HTMLParser的初步讲解。
应⽤实例将会在⽇后的⽂中介绍,敬请关注。
⼀、背景知识HTMLParser原本是⼀个在sourceforge上的⼀个Java开源项⽬,使⽤这个Java类库可以⽤来线性地或嵌套地解析HTML⽂本。
他的功能强⼤和开源等特性吸引了⼤量Web信息提取的⼯作者。
然⽽,许多.net开发者朋友⼀直在寻找⼀种能在.net中使⽤的HTMLParser类库,笔者将介绍Winista.HTMLParser类库,对⽐于其他原本数量就⾮常少的.net版HTMLParser类库,Winista的版本的类库结构可以说更接近于原始Java版本。
该类库⽬前分为Utltimate、Pro、Lite和Community四个版本,前三个版本都是收费的。
只有Community版本可以免费下载并查看所有的源码。
当前Community最新版本1.8 下载。
该版本的类库⽂档下载。
⼆、功能和特性1.可以在任何.net语⾔中使⽤(C#,,J#等)2.可以解析⼏乎所有的Html标签,并且可以通过标签类别、属性或正则表达式来搜索标签。
有些甚⾄在Java版本中⽆法⽀持的标签也在这个版本中得到了⽀持。
3.设置可扩展的过滤器来过滤结果集中不需要的标签。
4.⾼性能的API接⼝使得你能处理许多常见的问题,如:哪些是页⾯中的外部链接?哪些是图⽚?哪些是不同的表格?页⾯中有错误的链接吗等等问题。
5.⼀个基于Http协议引擎的配置⽂件使得你能通过⼀个指定的URL地址来获得该页⾯内容。
该爬⾍可以遵循robot.txt协议⽂件来获得组织和允许访问的列表。
6.Http协议引擎能够完整地处理来⾃任何站点的反馈。
三、词法分析的⼯作原理HTMLParser的词法分析器对HTML进⾏了4级封装,从低级到⾼级的顺序为:ParserStream、Source、Page、Lexer。
JavaParser使用指南JavaParser是一个用于解析Java源代码的库,提供了许多有用的API来分析和操作Java代码。
以下是使用JavaParser的简要指南:添加依赖:首先,您需要在项目中添加JavaParser的依赖。
您可以从Maven 中央仓库或JavaParser官方网站上下载相关依赖。
对于Maven项目,可以在pom.xml文件中添加以下依赖:java<dependency><groupId>com.github.javaparser</groupId><artifactId>javaparser-core</artifactId><version>3.24.0</version></dependency>2.解析Java源代码:使用JavaParser,您可以解析Java源代码并获取其抽象语法树(AST)。
以下是一个简单的示例,演示如何使用JavaParser解析一个Java类:javaimport com.github.javaparser.JavaParser;import pilationUnit;public class JavaParserExample {public static void main(String[] args) {String javaCode = "public class HelloWorld {\n" +" public static void main(String[] args) {\n" +" System.out.println(\"Hello, World!\");\n" +" }\n" +"}";JavaParser javaParser = new JavaParser();CompilationUnit cu = javaParser.parse(javaCode);System.out.println(cu.toString());}}这将解析提供的Java代码,并将其转换为一个CompilationUnit对象。
htmlparser使用指南需要做一个垂直搜索引擎,比较了nekohtml和htmlparser 的功能,尽管nekohtml在容错性、性能等方面的口碑好像比htmlparser好(htmlunit也用的是nekohtml),但感觉nekohtml的测试用例和文档都比htmlparser都少,而且htmlparser基本上能够满足垂直搜索引擎页面处理分析的需求,因此先研究一下htmlparser的使用,有空再研究nekohtml和mozilla html parser的使用。
html的功能还是官方说得最为清楚,HTML Parser is a Java library used to parse HTML in either a linear or nested fashion.Primarily used for transformation or extraction, it features filters, visitors, custom tags and easy to use JavaBeans. It is a fast, robust and well tested package.The two fundamental use-cases that are handled by the parser are extraction and transformation (the syntheses use-case, where HTML pages are created from scratch, is better handled by other tools closer to the source of data). While prior versionsconcentrated on data extraction from web pages, Version 1.4 of the HTMLParser has substantial improvements in the area of transforming web pages, with simplified tagcreation and editing, and verbatim toHtml() method output.研究的重点还是extraction的使用,有空再研究transformation的使用。
使用 HttpClient 和 HtmlParser 实现简易爬虫这篇文章介绍了HtmlParser 开源包和HttpClient 开源包的使用,在此基础上实现了一个简易的网络爬虫(Crawler),来说明如何使用HtmlParser 根据需要处理Internet 上的网页,以及如何使用HttpClient 来简化Get 和Post 请求操作,构建强大的网络应用程序。
HttpClient 与HtmlParser 简介本小结简单的介绍一下HttpClinet 和HtmlParser 两个开源的项目,以及他们的网站和提供下载的地址。
HttpClient 简介HTTP 协议是现在的因特网最重要的协议之一。
除了WEB 浏览器之外,WEB 服务,基于网络的应用程序以及日益增长的网络计算不断扩展着HTTP 协议的角色,使得越来越多的应用程序需要HTTP 协议的支持。
虽然JAVA 类库 .net 包提供了基本功能,来使用HTTP 协议访问网络资源,但是其灵活性和功能远不能满足很多应用程序的需要。
而Jakarta Commons HttpClient 组件寻求提供更为灵活,更加高效的HTTP 协议支持,简化基于HTTP 协议的应用程序的创建。
HttpClient 提供了很多的特性,支持最新的HTTP 标准,可以访问这里了解更多关于HttpClinet 的详细信息。
目前有很多的开源项目都用到了HttpClient 提供的HTTP功能,登陆网址可以查看这些项目。
本文中使用HttpClinet 提供的类库来访问和下载Internet上面的网页,在后续部分会详细介绍到其提供的两种请求网络资源的方法:Get 请求和Post 请求。
Apatche 提供免费的HTTPClien t源码和JAR 包下载,可以登陆这里下载最新的HttpClient 组件。
笔者使用的是HttpClient3.1。
HtmlParser 简介当今的Internet 上面有数亿记的网页,越来越多应用程序将这些网页作为分析和处理的数据对象。
javaparser 使用案例JavaParser是一款基于Java语言的开源解析器。
它是一个轻量级的库,用于解析、分析和操作Java 8或Java 10代码,并生成AST(抽象语法树)表示。
JavaParser是被广泛使用于分析和操作Java代码的工具。
在这篇文章中,我将介绍JavaParser的一些使用案例,展示如何利用JavaParser来分析和操作Java代码。
一、Java Parser概述Java Parser主要提供以下API来操作Java代码:1. JavaParser.parse():利用JavaParser.parse()方法可以将一个字符串或文件解析为一个AST。
2. CompilationUnit:AST的根节点,表示整个编译单元。
3. ASTVisitor:遍历AST的访问器,可以在AST节点上执行各种操作。
JavaParser的使用一般分为两步:将Java代码解析为AST,然后再在AST上执行各种操作。
以下面的Java代码为例:```javapublic class HelloWorld {1. 将Java代码解析为AST使用JavaParser.parse()方法将Java代码解析为AST:```javaimport java.io.FileInputStream;import japa.parser.JavaParser;import pilationUnit;// 处理AST}}```在ASTVisitor中继承visit()方法,在visit()方法中实现对AST节点的操作。
以下示例演示如何遍历AST,并打印出每个节点的名称和行号:public class MethodCallPrinter extends VoidVisitorAdapter<Void> {@Overridepublic void visit(MethodCallExpr n, Void arg) {System.out.println("Method call: " + n.getName() + " on line " + n.getBeginLine());super.visit(n, arg);}MethodCallPrinter visitor = new MethodCallPrinter();visitor.visit(cu, null);}}```以上代码会输出以下内容:1.检查Java代码的代码规范Java Parser可以用来检查Java代码是否符合一定的代码规范。
基于HTMLParser的Web文献信息提取摘要:基于HTMLParser对网页进行解析,可抽取标签间的Link、image、meta 和title 等信息。
使用HTMLParser来提取Web文献中的题名、关键字、摘要、作者、来源等信息,清洗后存入MySql 数据库当中,以备后续数据挖掘使用。
对此进行了论述。
关键词:HTMLParser;Web文献;信息提取大量的科研项目,每年都会有数以万计的文献产生。
随之而来的问题是如此多的文献数据让人难以消化,无法从表面上看出它们所蕴涵的有用信息,更不用说有效地指导进一步的工作。
如何从大量的数据中找到真正有用的信息成为人们关注的焦点,数据挖掘技术也正是伴随着这种需求从研究走向应用。
近年来,随着Web技术的快速普及和迅猛发展,使各种信息可以以非常低的成本在网络上获得。
本文就是要利用网络爬虫技术,对Web文献进行抓取数据,构建数据仓库,以挖掘出有用的信息。
1HTMLParser简介HTMLParser是一个纯的Java写的HTML解析的库,它不依赖于其它的Java库文件,主要用于改造或提取html。
它提供了接口,支持线性和嵌套HTML文本。
在实际的项目中只需要将htmlparser.jar 导入classpath中,就可以使用Htmlparser提供的API了。
HTMLParser项目主要可以用在以下两个方面:(1)信息提取。
文本信息抽取,例如对HTML进行有效信息搜索;链接提取,用于自动给页面的链接文本加上链接的标签;资源提取,例如对一些图片、声音的资源的处理;链接检查,用于检查HTML中的链接是否有效;页面内容的监控。
(2)信息转换。
链接重写,用于修改页面中的所有超链接;网页内容拷贝,用于将网页内容保存到本地;内容检验,可以用来过滤网页上一些令人不愉快的字词;HTML信息清洗,把本来乱七八糟的HTML信息格式化;转成XML格式数据。
HTMLParser由Node、AbstractNode 和Tag 来表达HTML。
使⽤JavaParser进⾏java源码解析刚开始接触的时候觉得和JDT⾥的Parser类不太⼀样。
查了⼀下WiKi,发现它访问编译单元成员,需要调⽤相应⼦元素对应的Visitor类的visit()⽅法。
此⽅法可以通过复写来实现⾃⼰需要的功能。
我需要的功能是将编译单元⾥的所有MethodDeclaration取出,因此利⽤传递句柄的⽅式,实现代码如下:1public static List<MethodDeclaration> getMethodList(CompilationUnit cu) {2 List<MethodDeclaration> methodList = new ArrayList<MethodDeclaration>();3new MethodGetterVisitor().visit(cu, methodList);45return methodList;6 }78private static class MethodGetterVisitor extends VoidVisitorAdapter<Object> {910 @SuppressWarnings("unchecked")11 @Override12public void visit(MethodDeclaration n, Object arg) {13 List<MethodDeclaration> methodList = new ArrayList<MethodDeclaration>();14 methodList = (List<MethodDeclaration>) arg;15 methodList.add(n);16 }17 }官⽅还提供了不通过Visitor改变⼀个类成员⽅法的⽰例(相对Visitor更复杂):1public class MethodChanger {23public static void main(String[] args) throws Exception {4// creates an input stream for the file to be parsed5 FileInputStream in = new FileInputStream("test.java");67 CompilationUnit cu;8try {9// parse the file10 cu = JavaParser.parse(in);11 } finally {12 in.close();13 }1415// change the methods names and parameters16 changeMethods(cu);1718// prints the changed compilation unit19 System.out.println(cu.toString());20 }2122private static void changeMethods(CompilationUnit cu) {23 List<TypeDeclaration> types = cu.getTypes();24for (TypeDeclaration type : types) {25 List<BodyDeclaration> members = type.getMembers();26for (BodyDeclaration member : members) {27if (member instanceof MethodDeclaration) {28 MethodDeclaration method = (MethodDeclaration) member;29 changeMethod(method);30 }31 }32 }33 }3435private static void changeMethod(MethodDeclaration n) {36// change the name of the method to upper case37 n.setName(n.getName().toUpperCase());3839// create the new parameter40 Parameter newArg = ASTHelper.createParameter(ASTHelper.INT_TYPE, "value");4142// add the parameter to the method43 ASTHelper.addParameter(n, newArg);44 }45 }最后附上WiKi⾥给出的编译单元创建⽰例:1public class ClassCreator {23public static void main(String[] args) throws Exception {4// creates the compilation unit5 CompilationUnit cu = createCU();67// prints the created compilation unit8 System.out.println(cu.toString());9 }1011/**12 * creates the compilation unit13*/14private static CompilationUnit createCU() {15 CompilationUnit cu = new CompilationUnit();16// set the package17 cu.setPakage(new PackageDeclaration(ASTHelper.createNameExpr("java.parser.test")));1819// create the type declaration20 ClassOrInterfaceDeclaration type = new ClassOrInterfaceDeclaration(ModifierSet.PUBLIC, false, "GeneratedClass");21 ASTHelper.addTypeDeclaration(cu, type);2223// create a method24 MethodDeclaration method = new MethodDeclaration(ModifierSet.PUBLIC, ASTHelper.VOID_TYPE, "main");25 method.setModifiers(ModifierSet.addModifier(method.getModifiers(), ModifierSet.STATIC));26 ASTHelper.addMember(type, method);2728// add a parameter to the method29 Parameter param = ASTHelper.createParameter(ASTHelper.createReferenceType("String", 0), "args");30 param.setVarArgs(true);31 ASTHelper.addParameter(method, param);3233// add a body to the method34 BlockStmt block = new BlockStmt();35 method.setBody(block);3637// add a statement do the method body38 NameExpr clazz = new NameExpr("System");39 FieldAccessExpr field = new FieldAccessExpr(clazz, "out");40 MethodCallExpr call = new MethodCallExpr(field, "println");41 ASTHelper.addArgument(call, new StringLiteralExpr("Hello World!"));42 ASTHelper.addStmt(block, call);4344return cu;45 }46 }。
javaparser 介绍摘要:1.简介2.功能3.特点4.使用场景5.安装与配置6.总结正文:【1.简介】javaparser 是一个强大的Java 代码解析库,它可以帮助开发者轻松地解析和分析Java 代码。
javaparser 支持多种版本的Java 语言,包括Java 5、Java 6、Java 7、Java 8 和Java 9。
它采用纯Java 编写,可以在任何Java 环境中使用,不受平台限制。
【2.功能】javaparser 提供了以下主要功能:- 解析Java 源代码和字节码文件- 分析类、方法、属性、参数等代码元素- 处理注解(如@Override、@Deprecated 等)- 支持访问修饰符(public、private、protected 等)- 解析并处理Java 代码中的导入语句- 解析并处理Java 代码中的泛型信息【3.特点】- 完全纯Java 实现,无需依赖其他库- 解析速度快,占用资源少- 支持多种Java 版本- 提供简单易用的API,易于集成到其他项目中【4.使用场景】javaparser 可以广泛应用于以下场景:- 代码生成:根据数据库表结构生成Java 代码- 代码审计:检查代码中存在的问题,如未处理的异常、未关闭的资源等- 代码重构:自动修改代码以改进其结构、可读性或性能- 依赖分析:分析项目中使用的第三方库及其版本信息- 代码搜索:在大型项目中快速查找特定方法或类【5.安装与配置】要在项目中使用javaparser,首先需要将其添加到项目的依赖中。
如果您使用的是Maven 项目,可以在pom.xml 文件中添加以下依赖:```xml<dependencies><dependency><groupId>com.github.javaparser</groupId><artifactId>javaparser</artifactId><version>3.2.0</version></dependency></dependencies>```对于其他构建工具(如Gradle 或手动下载),可以参考官方文档进行安装和配置。
声明:本人来自转载/HTMLParser具有小巧,快速的优点,缺点是相关文档比较少(英文的也少),很多功能需要自己摸索。
对于初学者还是要费一些功夫的,而一旦上手以后,会发现HTMLParser 的结构设计很巧妙,非常实用,基本你的各种需求都可以满足。
这里我根据自己这几个月来的经验,写了一点入门的东西,希望能对新学习HTMLParser 的朋友们有所帮助。
(不过当年高考本人语文只比及格高一分,所以文法方面的问题还希望大家多多担待)HTMLParser的核心模块是org.htmlparser.Parser类,这个类实际完成了对于HTML页面的分析工作。
这个类有下面几个构造函数:public Parser ();public Parser (Lexer lexer, ParserFeedback fb);public Parser (URLConnection connection, ParserFeedback fb) throws ParserException; public Parser (String resource, ParserFeedback feedback) throws ParserException; public Parser (String resource) throws ParserException;public Parser (Lexer lexer);public Parser (URLConnection connection) throws ParserException;和一个静态类public static Parser createParser (String html, String charset);对于大多数使用者来说,使用最多的是通过一个URLConnection或者一个保存有网页内容的字符串来初始化Parser,或者使用静态函数来生成一个Parser对象。
ParserFeedback的代码很简单,是针对调试和跟踪分析过程的,一般不需要改变。
而使用Lexer则是一个相对比较高级的话题,放到以后再讨论吧。
这里比较有趣的一点是,如果需要设置页面的编码方式的话,不使用Lexer就只有静态函数一个方法了。
对于大多数中文页面来说,好像这是应该用得比较多的一个方法。
下面是初始化Parser的例子。
package com.baizeju.htmlparsertester;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.FileInputStream;import java.io.File;import .HttpURLConnection;import .URL;import org.htmlparser.visitors.TextExtractingVisitor;import org.htmlparser.Parser;/*** @author */public class Main {private static String ENCODE = "GBK";private static void message( String szMsg ){try{System.out.println(newString(szMsg.getBytes(ENCODE),System.getProperty("file.encoding")));}catch(Exception e ){}}public static String openFile( String szFileName ){try {BufferedReader bis = new BufferedReader(new InputStreamReader(new FileInputStream( new File(szFileName)),ENCODE) );String szContent="";String szTemp;while ( (szTemp = bis.readLine()) != null){szContent+=szTemp+"\n";}bis.close();return szContent;}catch( Exception e ){return "";}}public static void main(String[] args){String szContent = openFile( "E:/My Sites/HTMLParserTester.html");try{//Parser parser = Parser.createParser(szContent, ENCODE);//Parser parser = new Parser( szContent );Parser parser = new Parser( (HttpURLConnection)(new URL("http://127.0.0.1:8080/HTMLParserTester.html")).openConnection());TextExtractingVisitor visitor = new TextExtractingVisitor();parser.visitAllNodesWith(visitor);String textInPage = visitor.getExtractedText();message(textInPage);}catch( Exception e ){ }}}加重的部分测试了几种不同的初始化方法,后面的显示了结果。
大家看到能Parser出内容就可以了,如何操作访问Parser的内容我们在后面讨论。
HTMLParser将解析过的信息保存为一个树的结构。
Node是信息保存的数据类型基础。
请看Node的定义:public interface Node extends Cloneable;Node中包含的方法有几类,对于树型结构进行遍历的函数,这些函数最容易理解:Node getParent():取得父节点NodeList getChildren():取得子节点的列表Node getFirstChild ():取得第一个子节点Node getLastChild():取得最后一个子节点Node getPreviousSibling ():取得前一个兄弟(不好意思,英文是兄弟姐妹,直译太麻烦而且不符合习惯,对不起女同胞了)Node getNextSibling():取得下一个兄弟节点取得Node内容的函数:String getText():取得文本String toPlainTextString():取得纯文本信息。
String toHtml() :取得HTML信息(原始HTML)String toHtml(boolean verbatim):取得HTML信息(原始HTML)String toString():取得字符串信息(原始HTML)Page getPage ():取得这个Node对应的Page对象int getStartPosition ():取得这个Node在HTML页面中的起始位置int getEndPosition():取得这个Node在HTML页面中的结束位置用于Filter过滤的函数:void collectInto(NodeList list, NodeFilter filter):基于filter的条件对于这个节点进行过滤,符合条件的节点放到list中。
用于Visitor遍历的函数:void accept(NodeVisitor visitor):对这个Node应用visitor用于修改内容的函数,这类用得比较少:void setPage(Page page):设置这个Node对应的Page对象void setText(String text):设置文本void setChildren(NodeList children):设置子节点列表其他函数:void doSemanticAction():执行这个Node对应的操作(只有少数Tag有对应的操作)Object clone():接口Clone的抽象函数。
实际我们用HTMLParser最多的是处理HTML页面,Filter或Visitor相关的函数是必须的,然后第一类和第二类函数是用得最多的。
第一类函数比较容易理解,下面用例子说明一下第二类函数。
下面是用于测试的HTML文件:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>白泽居</title></head><html xmlns="/1999/xhtml"><body ><div id="top_main"><div id="logoindex"><!--这是注释-->白泽居<a href="">白泽居</a></div>白泽居</div></body></html>测试代码:/*** @author */package com.baizeju.htmlparsertester;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.FileInputStream;import java.io.File;import .HttpURLConnection;import .URL;import org.htmlparser.Node;import org.htmlparser.util.NodeIterator;import org.htmlparser.Parser;/*** @author */public class Main {private static String ENCODE = "GBK";private static void message( String szMsg ){try{System.out.println(new String(szMsg.getBytes(ENCODE), System.getProperty("f ile.encoding"))); }catch(Exception e ){}}public static String openFile( String szFileName ){try{BufferedReader bis = new BufferedReader(new InputStreamReader(new FileInp utStream( newFile(szFileName)), ENCODE) );String szContent="";String szTemp;while ( (szTemp = bis.readLine()) != null){szContent+=szTemp+"\n";}bis.close();return szContent;}catch( Exception e ){return "";}}public static void main(String[] args){try{Parser parser = new Parser( (HttpURLConnection) (newURL("http://127.0.0.1:8080/HTMLParserTester.html")).openConnection() );for (NodeIterator i = parser.elements (); i.hasMoreNodes();){Node node = i.nextNode();message("getText:"+node.getText());message("getPlainText:"+node.toPlainTextString());message("toHtml:"+node.toHtml());message("toHtml(true):"+node.toHtml(true));message("toHtml(false):"+node.toHtml(false));message("toString:"+node.toString());message("=================================================");}}catch( Exception e ) {System.out.println( "Exception:"+e );}}}输出结果:getText:!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"getPlainText:toHtml:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd">toHtml(true):<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd">toHtml(false):<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd">toString:Doctype Tag : !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E N""/TR/xhtml1/DTD/xhtml1-transitional.dtd; begins at : 0; ends at : 121 ================================================= getText:getPlainText:toHtml:toHtml(true):toHtml(false):toString:Txt (121[0,121],123[1,0]): \n================================================= getText:headgetPlainText:白泽居toHtml:<head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>白泽居</title></head>toHtml(true):<head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>白泽居</title></head>toHtml(false):<head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>白泽居</title></head>toString:HEAD: Tag (123[1,0],129[1,6]): headTag (129[1,6],197[1,74]): meta http-equiv="Content-Type" content="text/html; ...Tag (197[1,74],204[1,81]): titleTxt (204[1,81],223[1,100]): 白泽居End (223[1,100],231[1,108]): /titleEnd (231[1,108],238[1,115]): /head================================================= getText:getPlainText:toHtml:toHtml(true):toHtml(false):toString:Txt (238[1,115],240[2,0]): \n=================================================getText:html xmlns="/1999/xhtml"getPlainText:白泽居 白泽居 白泽居toHtml:<html xmlns="/1999/xhtml"><body ><div id="top_main"><div id="logoindex"><!--这是注释-->白泽居<a href="">白泽居</a></div>白泽居</div></body></html>toHtml(true):<html xmlns="/1999/xhtml"><body ><div id="top_main"><div id="logoindex"><!--这是注释-->白泽居<a href="">白泽居</a></div>白泽居</div></body></html>toHtml(false):<html xmlns="/1999/xhtml"><body ><div id="top_main"><div id="logoindex"><!--这是注释-->白泽居<a href="">白泽居</a></div>白泽居</div></body></html>toString:T ag (240[2,0],283[2,43]): html xmlns="/1999/xhtml"Txt (283[2,43],285[3,0]): \nTag (285[3,0],292[3,7]): bodyTxt (292[3,7],294[4,0]): \nTag (294[4,0],313[4,19]): div id="top_main"Txt (313[4,19],316[5,1]): \n\tTag (316[5,1],336[5,21]): div id="logoindex"Txt (336[5,21],340[6,2]): \n\t\tRem (340[6,2],351[6,13]): 这是注释Txt (351[6,13],376[8,0]): \n\t\t白泽居\nTag (376[8,0],409[8,33]): a href=""Txt (409[8,33],428[8,52]): 白泽居End (428[8,52],432[8,56]): /aTxt (432[8,56],435[9,1]): \n\tEnd (435[9,1],441[9,7]): /divTxt (441[9,7],465[11,0]): \n\t白泽居\nEnd (465[11,0],471[11,6]): /divTxt (471[11,6],473[12,0]): \nEnd (473[12,0],480[12,7]): /bodyTxt (480[12,7],482[13,0]): \nEnd (482[13,0],489[13,7]): /html================================================= 对于第一个Node的内容,对应的就是第一行<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/T R/xhtml1/DTD/xhtml1-transitional.dtd">,这个比较好理解。