admin

该用户没有分享资料


admin

在Struts 2中实现文件上传

http://www.duduwolf.com/wiki/2007/334.html

java-dom4j命名空间问题解决方法

大家经常运用DOM4J操作XML文档,如果XML文档存在namespace的话,读写XML经常不工作,解决方案很简单的:

一个XML文件头

<?xml version=”1.0″?>
<scxml xmlns=”http://www.w3.org/2005/07/scxml”
version=”1.0″
initialstate=”coordinator”>

请注意这个xml文件是带了namespace的

读写这个xml要如下操作:

InputStream is = FileInputStream(filePath);
SAXReader reader = new SAXReader();
Map map = new HashMap();//store namespace-mapping
map.put(“scxml”,”http://www.w3.org/2005/07/scxml”);
reader.getDocumentFactory().setXPathNamespaceURIs(map);
Document document = reader.read(is);

在操作任何节点的时候,你的XPath必须都要加上Namespace,以下都是可行的XPath表达式:

String strXPath = “//scxml:state[@id='member_init']“;
String strXPath = “/scxml:*[name()='scxml']/scxml:*[name()='datamodel']/scxml:data/@name”;

String  strXPath = “/scxml:*[name()='scxml']/scxml:*[name()='state']/scxml:*[name()='state' and @id='member_init']/scxml:transition”;
List list = document.selectNodes(strXPath);

看到没有,所有的//和/后面都要加上”scxml:”(节点属性前面不要加) .

第一个表达式是要找文档里面id为’member_init’的state节点
第二个表达式是找name属性,这个name属性的有这样的祖先链/scxml/datamodel/data
第三个也没什么了,跟找节点transition,并对它的祖先链有所要求
当然这里你也要小心的对属性元素区别处理,因为属性名前是不带namespace的.

本文地址:http://www.yaronspace.cn/blog/index.php/archives/196

javascript-getElementById()和getElementsByName()

之前一直用jQuery,基本没直接写过getElementById()等查询节点的函数,今天用了下getElementsByName(),调试了半天,才成功。原因就在于那个S,getElementById()返回的是一个tag,而getElementsByName()返回的是tag的数组Object[],如果想访问的话必须使用下标,getElementsByName(“testName”)[0];对于getElementsByTagName()同样的道理。

getElementById()是只返回一个,id唯一

本文地址:http://www.yaronspace.cn/blog/index.php/archives/193

Trie树|字典树的简介及实现【转】

今天才知道原来还有叫做Trie的很重要的数据结构,真是无知呀!

http://hi.baidu.com/ecchi/blog/item/84bcdc3ff832a5c37d1e71bf.html

http://hi.baidu.com/luyade1987/blog/item/2667811631106657f2de320a.html

Trie,又称字典树、单词查找树,是一种树形结构,用于保存大量的字符串。它的优点是:利用字符串的公共前缀来节约存储空间。
相对来说,Trie树是一种比较简单的数据结构.理解起来比较简单,正所谓简单的东西也得付出代价.故Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.

其基本性质可以归纳为: 更多 >

java-org.dom4j常用api介绍

//导入必要的包
import org.dom4j.Document;//Document文档类
import org.dom4j.Element//元素节点类
import org.dom4j.QName;//一个对元素名字的封装类
 
import org.dom4j.io.SAXReader;//sax读取类
import org.dom4j.io.XMLWriter;//xml写入类
import org.dom4j.io.OutputFormat;//输出格式
 
//读入xml文件
String fileName = "*****";
InputStream input = new FileInputStream(fileName);
SAXReader reader = new SAXReader();
Document doc = reader.read(input); <a href="http://yaronspace.cn/blog/archives/185#more-185" class="more-link">更多 &gt;</a>

java-string-第一个字母大写的实现

code:

String name = “yaronspace”;
name = name.substring(0,1).toUpperCase() + name.substring(1);

output:

Yaronspace

本文地址:http://www.yaronspace.cn/blog/index.php/archives/181

xpath-namespace

当利用xpath查询时,遇到命名空间时,正常的xpath表达式就会无效,一种利用xpath-namspace查询的方法是使用local-name()这个本地化函数,可以将namespace忽略

/*[local-name()='definitions']/*[local-name()='service']

上述表达式可以查到xml片段

<wsdl:definitions>

<wsdl:service>tt</wsdl:service>

<wsdl:definitions>

本文地址:http://www.yaronspace.cn/blog/index.php/archives/179

XPath详解<2>

常用表达式实例:

/ Document Root文档根.
/* 选择文档根下面的所有元素节点,即根节点(XML文档只有一个根节点)
/node() 根元素下所有的节点(包括文本节点,注释节点等)
/text() 查找文档根节点下的所有文本节点
/messages/message messages节点下的所有message节点
/messages/message[1] messages节点下的第一个message节点
/messages/message[1]/self::node() 第一个message节点(self轴表示自身,node()表示选择所有节点)
/messages/message[1]/node() 第一个message节点下的所有子节点
/messages/message[1]/*[last()] 第一个message节点的最后一个子节点
/messages/message[1]/[last()] Error,谓词前必须是节点或节点集
/messages/message[1]/node()[last()] 第一个message节点的最后一个子节点
/messages/message[1]/text() 第一个message节点的所有子节点
/messages/message[1]//text() 第一个message节点下递归下降查找所有的文本节点(无限深度)
/messages/message[1] /child::node()

/messages/message[1] /node()

/messages/message[position()=1]/node()

//message[@id=1] /node()

第一个message节点下的所有子节点
//message[@id=1] //child::node() 递归所有子节点(无限深度)
//message[position()=1]/node() 选择id=1的message节点以及id=0的message节点
/messages/message[1] /parent::* Messages节点
/messages/message[1]/body/attachments/parent::node()

/messages/message[1]/body/attachments/parent::* /messages/message[1]/body/attachments/..

attachments节点的父节点。父节点只有一个,所以node()和* 返回结果一样。

(..也表示父节点. 表示自身节点)

//message[@id=0]/ancestor::* Ancestor轴表示所有的祖辈,父,祖父等。

向上递归

//message[@id=0]/ancestor-or-self::* 向上递归,包含自身
//message[@id=0]/ancestor::node() 对比使用*,多一个文档根元素(Document root)
/messages/message[1]/descendant::node()

//messages/message[1]//node()

递归下降查找message节点的所有节点
/messages/message[1]/sender/following::* 查找第一个message节点的sender节点后的所有同级节点,并对每一个同级节点递归向下查找。
//message[@id=1]/sender/following-sibling::* 查找id=1的message节点的sender节点的所有后续的同级节点。
//message[@id=1]/datetime/@date 查找id=1的message节点的datetime节点的date属性
//message[@id=1]/datetime[@date]

//message/datetime[attribute::date]

查找id=1的message节点的所有含有date属性的datetime节点
//message[datetime] 查找所有含有datetime节点的message节点
//message/datetime/attribute::*

//message/datetime/attribute::node()

//message/datetime/@*

返回message节点下datetime节点的所有属性节点
//message/datetime[attribute::*]

//message/datetime[attribute::node()]

//message/datetime[@*]

//message/datetime[@node()]

选择所有含有属性的datetime节点
//attribute::* 选择根节点下的所有属性节点
//message[@id=0]/body/preceding::node() 顺序选择body节点所在节点前的所有同级节点。(查找顺序为:先找到body节点的顶级节点(根节点),得到根节点标签前的所有同级节点,执行完成后继续向下一级,顺序得到该节点标签前的所有同级节点,依次类推。)

注意:查找同级节点是顺序查找,而不是递归查找。

//message[@id=0]/body/preceding-sibling::node() 顺序查找body标签前的所有同级节点。(和上例一个最大的区别是:不从最顶层开始到body节点逐层查找。我们可以理解成少了一个循环,而只查找当前节点前的同级节点)
//message[@id=1]//*[namespace::amazon] 查找id=1的所有message节点下的所有命名空间为amazon的节点。
//namespace::* 文档中的所有的命名空间节点。(包括默认命名空间xmlns:xml)
//message[@id=0]//books/*[local-name()='book'] 选择books下的所有的book节点,

注意:由于book节点定义了命名空间<amazone:book>.若写成//message[@id=0]//books/book则查找不出任何节点。

//message[@id=0]//books/*[local-name()='book' and namespace-uri()='http://www.amazon.com/books/schema'] 选择books下的所有的book节点,(节点名和命名空间都匹配)
//message[@id=0]//books/*[local-name()='book'][year>2006] 选择year节点值>2006的book节点
//message[@id=0]//books/*[local-name()='book'][1]/year>2006 指示第一个book节点的year节点值是否大于2006.

返回xs:boolean: true


本文地址:http://www.yaronspace.cn/blog/index.php/archives/177

XPath详解<1>

经常在工作中会使用到XPath的相关知识,但每次总会在一些关键的地方不记得或不太清楚,所以免不了每次总要查一些零碎的知识,感觉即很烦又浪费时间,所以对XPath归纳及总结一下。

在这篇文章中你将能学习到

  • XPath简介
  • XPath 路径表达式详解
  • XPath在DOM,XSLT及XQuery中的应用

XPath简介

XPath是W3C的一个标准。它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计。目前有XPath1.0和 XPath2.0两个版本。其中Xpath1.0是1999年成为W3C标准,而XPath2.0标准的确立是在2007年。W3C关于XPath的英文 详细文档请见:http://www.w3.org/TR/xpath20/

XPath是一种表达式语言,它的返回值可能是节点,节点集合,原子值,以及节点和原子值的混合等。XPath2.0是XPath1.0的超集。它 是对XPath1.0的扩展,它可以支持更加丰富的数据类型,并且XPath2.0保持了对XPath1.0的相对很好的向后兼容性,几乎所有的 XPath2.0的返回结果都可以和XPath1.0保持一样。另外XPath2.0也是XSLT2.0和XQuery1.0的用于查询定位节点的主表达 式语言。XQuery1.0是对XPath2.0的扩展。关于在XSLT和XQuery中使用XPath表达式定位节点的知识在后面的实例中会有所介绍。 更多 >

分享wordpress为添加评论验证码插件

今天很郁闷,上我的空间时,居然国外的机器人在我的某篇文章下面添加了600多垃圾评论,最后手工删除实在费劲,只好直接删数据库才算搞定!然后赶紧就上网找了个wordpress评论添加验证码插件,功能还是很不错的,叫wp-seccode,分享之。
直接上传,启用即可,如果无法看到验证码,就到wp-seccode-run.php中$plugin_dir路径是否设置正确,最好设置为完整路径,比如:

var $plugin_dir = ‘http://www.yaronspace.cn/blog/wp-content/plugins/wp-seccode’;

下载地址

本文地址:http://www.yaronspace.cn/blog/index.php/archives/170