- 博客开通了,标记一个:) a new start [2007-12-29 13:53]
-
Java字符串split方法的小陷阱
2009-07-29 17:07:57 by deepblue今天在写一个Java字符串切分程序时,发现切分后的计数一直有问题,调了半天才找到原因。。。
下面先来看一个问题:有字符串str=“string split test” ,使用String类的split方法,根据空格切分后的字符串数组有多少个元素?我们可以用下面的程序来测试:
String str = "string split test";
String[] result = str.split(" ");
System.out.println("Result size: " + result.length);
for (String s : result)
System.out.println(s);程序输出为:
Result size: 3
string
split
test嗯,和我们想的一样,原来的字符串被空格切分成了3个新的字符串。
再来看一个问题:有字符串str=“” (空字符串),使用String类的split方法,根据空格切分后的字符串数组有多少个元素?
还是用程序来测试:
str = "";
result = str.split(" ");
System.out.println("Result size: " + result.length);
for (String s : result)
System.out.println(s);程序输出为:
Result size: 1
这里居然是1,而不是我之前认为的0,里面的元素是与原字符串相同的空字符串。
仔细想想,其实是有道理的。无论原字符串的内容是什么,通过split切分后,如果原字符串中没有出现切分定界符,那么切分结果就返回以原字符串为原始的字符串数组;如果原字符串中有切分定界符,则从定界符处将原字符串断开,将生成的新字符串按顺序以数组的形式返回。
-
中文分词与词性标注测评程序
2009-07-21 00:53:03 by deepblue前几天为了测试中文分词和词性标注程序的效果,写了一个简单的测试程序,用于测试分词和词性标注结果的precision,recall和F-score。下面是测试输出:
--------------Evaluation Result-------------
Word Count Standard: 69953, Word Count Test: 69231, Correct Segmented: 67212
P-Word=0.9708367638774538
R-Word=0.9608165482538276
F-Word=0.9658006667433038POS Count Standard: 69953, POS Count Test: 69231, Correct Segmented: 64159
P-POS=0.9267380219843712
R-POS=0.9171729589867482
F-POS=0.9219306816875502测试程序附在此,需要的朋友可以直接用: 中文分词与词性标注测试程序
-
译书已出版
2009-02-13 21:52:12 by deepblue去年10月份翻译的Java编程技术书籍《Java TCP/IP Socket编程(原书第2版)》已由机械工业出版社出版,详情可以点击这里,这里和这里查看
。“该书内容简明扼要,条理清晰,并在讲解相应的概念或编程技巧时列举了大量的示例程序,每章附有练习,适合作为Java Socket编程的入门教程,也可供从事网络相关专业的技术人员参考。
译者在翻译本书时尽量忠实于原文,必要时对原书中提到的概念作了一定的解释,并力求做到言简意赅,限于水平,翻译过程中难免有疏漏之处,敬请广大读者批评指正。”
从个人角度而言,我还是更倾向于阅读英文原版书籍。那为什么还要翻译书呢?因为考虑到,毕竟还是有很大一部分人需要看中文书籍的,如果因为语言原因而不能学习到好的技术是让人遗憾的事。因此,我建议有能力阅读英文原版书籍,并有能力支付(通常原版书籍都非常昂贵)的朋友还是购买原版书进行学习,同时,也希望我翻译的这本书能够为有阅读中文书籍需求的朋友提供忠实于原著的,方便而有价值的参考。
-
NekoHtml与XPath
2008-11-25 12:49:40 by deepblue今天用NekoHtml将html网页转换成DOM,再使用XPath筛选节点时,始终不能成功,结果集始终为空。找了半天原因,才发现使用XPath时,其中的tag必须是大写英文字母。示例代码如下:
Java语言: NekoHtml+XPathString productsXpath = "//TABLE[@id='product-list']//DIV[1]/B/A"; // tags should be in upper case
NodeList products;
try {
products = XPathAPI.selectNodeList(dom, productsXpath);
System.out.println("found: " + products.getLength());
}catch (TransformerException e) {
e.printStackTrace();
}注意上面代码中:String productsXpath = "//TABLE[@id='product-list']//DIV[1]/B/A";
如果将其变成String productsXpath = "//table[@id='product-list']//div[1]/b/a"; 则无法找到期望的节点。
-
过滤XML文件中的无效字符
2008-08-22 14:47:20 by deepblue最近在处理XML文件时遇到一个问题,即由于自己写程序生成的XML文件中包含了一些不可见的无效字符,导致JDom在解析该文件是抛出异常。
这里的无效字符不是指<,>等不能出现在XML文件的标签以外的字符,也不是由于编码问题引起的乱码,而是一些超出XML合法字符范围的不可见字符。查了一下W3C中对XML 1.0的定义[1],其Unicode的合法字符范围是:
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
/* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */为了保证常用XML解析工具能将自己生成的XML文件成功解析,就需要先将文件中的无效字符过滤掉,或在生成XML文件时就对字符的有效性进行判断,抛弃无效字符。
下面是我在网上看到的一种使用Java来过滤XML非法字符的方法[2]:
Java语言: 过滤XML中的不可见无效字符/**
* This method ensures that the output String has only valid XML unicode
* characters as specified by the XML 1.0 standard. For reference, please
* see <a href="http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char">the
* standard</a>. This method will return an empty String if the input is
* null or empty.
*
* @param in
* The String whose non-valid characters we want to remove.
* @return The in String, stripped of non-valid characters.
*/
public static String stripNonValidXMLCharacters(String in) {
StringBuffer out = new StringBuffer(); // Used to hold the output.
char current; // Used to reference the current character.
if (in == null || ("".equals(in)))
return ""; // vacancy test.
for (int i = 0; i < in.length(); i++) {
current = in.charAt(i); // NOTE: No IndexOutOfBoundsException caught
// here; it should not happen.
if ((current == 0x9) || (current == 0xA) || (current == 0xD)
|| ((current >= 0x20) && (current <= 0xD7FF))
|| ((current >= 0xE000) && (current <= 0xFFFD))
|| ((current >= 0x10000) && (current <= 0x10FFFF)))
out.append(current);
}
return out.toString();
}实际上就是将字符串中的每个字符进行有效性判断,再将有效字符重新构建成一个新的字符串返回。
其实,使用一些XML工具包来生成XML 文件一般都能避免写入无效字符,不过灵活性上就不如自己用程序生成了。
另外,一直让我困惑的是,我所见到的XML工具包都是先将所有数据在内存中生成整个DOM对象,再全部写入文件,读取时也是先将整个XML文件读入内存,生成DOM对象,再进行解析。但是如果XML文件很大,内存装不下的话,这种方法岂不是不能用了?
不知是否是因为我孤陋寡闻,没有找到好的工具,还是由于XML本来就被设计为用来存储便于网络传输的少量数据的,因而没有考虑大文件的解析方法。
参考资料:
[1] http://www.w3.org/TR/2000/REC-xml-20001006
[2] http://cse-mjmcl.cse.bris.ac.uk/blog/2007/02/14/1171465494443.html -
Eclipse 添加javadoc和source
2008-05-24 01:38:43 by deepblue -
XPath常用定位节点元素语句总结
2008-01-12 13:05:53 by deepblue这是很久以前在csdn的blog上写的文章,现在转过来,那个blog就作为附属站点了。
----------------------
将一个XML或HTML文档转换成了DOM树结构后,如何才能定位到特定的节点?XPath实现了这样的功能,它通过DOM树中节点的路径和属性来导航,通过XPath路径表达式可以选择DOM树中的nodes(节点)或是node-set(节点集)。
XPath包含了数量超过100的内置函数。这些函数针对字符串值,数字值,日期和时间比较,节操作,顺序操作,布尔值,等
解析用的java包
Java 5 推出了 javax.xml.xpath 包,这是一个用于 XPath 文档查询的独立于 XML 对象模型的库。
Xalan-Java http://xml.apache.org/xalan-j/
常用函数
xpath的常用函数主要包含节点集函数,字符串函数,布尔函数,数字函数,网上的资料较多,在此就不再累述,可参考以下资料:
[a] XPath, XQuery, and XSLT Functions http://www.w3schools.com/xpath/xpath_functions.asp
[b] XPath Functions http://www.caucho.com/resin-3.0/xml/xpath-fun.xtp
[c] XPath Functions(MSDN) http://msdn2.microsoft.com/en-us/library/ms256138.aspx
常用定位语句实例
1. //NODE[not(@class)] 所有节点名为node,且不包含class属性的节点
2. //NODE[@class and @id] 所有节点名为node,且同时包含class属性和id属性的节点
3. //NODE[contains(text(),substring] 所有节点名为node,且其文本中包含substring的节点
//A[contains(text(),\"下一页\")] 所有包含“下一页”字符串的超链接节点
//A[contains(@title,"文章标题")] 所有其title属性中包含“文章标题”字符串的超链接节点
4. //NODE[@id="myid"]/text() 节点名为node,且属性id为myid的节点的所有直接text子节点
5. BOOK[author/degree] 所有包含author节点同时该author节点至少含有一个的degree孩子节点的book节点
6. AUTHOR[.="Matthew Bob"] 所有值为“Matthew Bob”的author节点
7. //*[count(BBB)=2] 所有包含两个BBB孩子节点的节点
8. //*[count(*)=2] 所有包含两个孩子节点的节点
9. //*[name()='BBB'] 所有名字为BBB的节点,等同于//BBB
10. //*[starts-with(name(),'B')] 所有名字开头为字母B的节点
11. //*[contains(name(),'C')] 所有名字中包含字母C的节点
12. //*[string-length(name()) = 3] 名字长度为3个字母的节点
13. //CCC | //BBB 所有CCC节点或BBB节点
14. /child::AAA 等价于/AAA
15. //CCC/descendant::* 所有以CCC为其祖先的节点
16. //DDD/parent::* DDD节点的所有父节点
17. //BBB[position() mod 2 = 0] 偶数位置的BBB节点
18. AUTHOR[not(last-name = "Bob")] 所有不包含元素last-name的值为Bob的节点
19. P/text()[2] 当前上下文节点中的P节点的第二个文本节点
20. ancestor::BOOK[1] 离当前上下文节点最近的book祖先节点
21. //A[text()="next"] 锚文本内容等于next的A节点
最后推荐一款在Firefox中用的XPath插件:
XPath Checker
https://addons.mozilla.org/en-US/firefox/addon/1095
这个插件可以方便查看网页中任意元素的XPath路径,但其自动生成的XPath路径通常不是最简路径。
参考资料:
[1]XPath Examples. http://msdn2.microsoft.com/en-us/library/ms256086.aspx
[2]XPath Tutorial http://www.zvon.org/xxl/XPathTutorial/Output/example1.html
[3]XPath介绍 http://www.xml.org.cn/dispbbs.asp?boardID=14&ID=35493
[4]XPath reference http://msdn2.microsoft.com/en-us/library/ms256115.aspx
[5]XML Path Language (XPath)Version 1.0 http://www.w3.org/TR/xpath
[6]XPath Tutorial http://www.w3schools.com/xpath/default.asp
-
Log4j使用总结
2008-01-09 01:29:52 by deepblue以前的项目中为了能够检查程序的运行状态,需要将程序运行时的一些信息记录到日志文件中。
Log4j是一个较全面的日志软件包,能够满足各种形式的日志记录需要,并且使用起来比较方便,结构非常清晰,经过这段时间的使用,对其进行了较详细的学习,在实际项目的使用中,深刻感受到了它的方便和功能的全面。
Log4j的基本使用方法在其官方网站上有较详细的介绍,下面这篇文章对于...







