赞
踩
动态模型适合把各种技术和应用包装成模型,然后通过模型可以快速使用这些技术和应用,XWorker把JSoup简单封装成了模型,本文将简单介绍一下JSoup模型。
JSoup是一个Java API,用于处理HTML,它提供了大量的相关方法,把JSoup封装成模型的难点在于如何封装这些方法。
XWorker的思路是HTML是一个树形结构的数据,因此JSoup模型也采用了树形的结构。比如Element节点下有AllElements节点,而AllElements节点就是对JSoup的Element.getAllElements()方法的封装,在AllElements节点下又可以添加其它节点来处理Elements或单个Element。
模型通常是死板的,即模型是对特有的功能的封装。在动态模型里常常使用脚本和动作来解决模型的死板问题。通常模型和脚本动作等结合在一起,既可以通过模型简单快速的使用功能,也可以通过脚本实现特殊的需求,比如未模型化的功能等。
在线示例https://www.xworker.org/rap?app=xworker.example.ExampleRWT&key=jsoup,下面的示例可以在在线示例中找到和运行。
下面的示例打印了XWorker的主页中的所有元素,通过模型可以快速获取Document和遍历所有Element,通过脚本可以实现自定义的内容。
- <?xml version="1.0" encoding="utf-8"?>
-
- <Document name="AllElements" descriptors="xworker.org.jsoup.DocumentActions/@Document"
- url="https://www.xworker.org/do?sc=xworker.app.orgweb.web.Index&id=11">
- <description><![CDATA[<p>浏览文档的全部元素。</p>
- ]]></description>
- <AllElements interpretationType="">
- <ListIterator>
- <Groovy name="printLog">
- <code><![CDATA[import xworker.lang.executor.Executor;
-
- def TAG = "AllElements";
- Executor.info(TAG, element.tagName() + ":" + element.text());]]></code>
- </Groovy>
- </ListIterator>
- </AllElements>
- </Document>
通过ElementsByTag选择标签a的元素,然后通过ListIterator遍历,最后通过Document打开链接。
- <?xml version="1.0" encoding="utf-8"?>
-
- <Document name="GrabLinks" descriptors="xworker.org.jsoup.DocumentActions/@Document" url="https://www.xworker.org/do?sc=xworker.app.orgweb.web.Index&id=11">
- <description><![CDATA[<p>抓取网页中的所有连接,即<a href=.../>。</p>
- ]]></description>
- <ElementsByTag tagName="a">
- <ListIterator>
- <RunAction>
- <ExecutorLog name="log" descriptors="xworker.lang.executor.ExecutorActions/@Log"
- executorService="var:executorService" tag="GrabLinks" message="template:开始抓取:${element.absUrl("href")}"></ExecutorLog>
- </RunAction>
- <Document url="ognl:element.absUrl("href")">
- <RunAction>
- <ExecutorLog name="log" descriptors="xworker.lang.executor.ExecutorActions/@Log"
- executorService="var:executorService" tag="GrabLinks" message="template:URL已抓取:${document.title()}"></ExecutorLog>
- </RunAction>
- </Document>
- </ListIterator>
- </ElementsByTag>
- </Document>
在本示例里获取所有表单(示例界面只有一个表单),然后设置表单中的name和password输入框的值,最后通过Post提交并打印提交后的网页的内容。
- <?xml version="1.0" encoding="utf-8"?>
-
- <Document name="FormSubmit" descriptors="xworker.org.jsoup.DocumentActions/@Document" url="https://www.xworker.org/do?sc=xworker.example.web.login.LoginExample">
- <description><![CDATA[<p>首先抓取登录页面,然后填入用户名和密码并提交,最后在日志中输出表单提交后返回的界面。</p>
- ]]></description>
- <AllElements>
- <Forms interpretationType="">
- <Iterator>
- <Groovy name="setFormValue">
- <code><![CDATA[import xworker.lang.executor.Executor;
-
- def TAG = "FormSubmit";
- for(element in form.elements()){
- if(element.attr("name") == "name"){
- element.val("admin");
- }else if(element.attr("name") == "password"){
- element.val("admin");
- }
- Executor.info(TAG, element.attr("name") + "=" + element.val());
- }]]></code>
- </Groovy>
- <Submit>
- <Post>
- <RunAction descriptors="xworker.org.jsoup.Commons/@RunAction">
- <ExecutorLog name="log" descriptors="xworker.lang.executor.ExecutorActions/@Log"
- executorService="var:executorService" tag="FormSubmit"
- message="template:表单已提交:${document?string}"></ExecutorLog>
- </RunAction>
- </Post>
- </Submit>
- </Iterator>
- </Forms>
- </AllElements>
- </Document>
通过本文可以知道像JSoup这样的API也是可以封装成模型的。在本文里并没有编辑JSoup模型的例子,但实际使用时会发现相对于编写Java代码,通过模型调用JSoup要简单和方便的多,并且通过脚本还可以实现模型本身没有实现的功能。
目前XWorker只是初步封装了JSoup模型,后续可能会编写更多的相关模型,比如可能会实现断点续传下载大文件等等,另外第三方的模型也可以加入到JSoup模型框架里。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。