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。
声明:本人来自转载/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">,这个比较好理解。