常用链接

统计

最新评论

#

JUnit 学习笔记 2007版(转)

     摘要: 一、简介     JUnit是一款由Erich Gamma(《设计模式》的作者)和Kent Beck(极限编程的提出者)编写的开源的回归测试框架,供Java编码人员做单元测试之用。当前版本4.1,可以从www.junit.org网站上获得。与早期的JUnit 3相比,JUnit 4.1依赖于Java 5.0的新特性,因此无法兼容于jdk 1.4,可以说是一...  阅读全文

posted @ 2007-10-24 13:10 九宝 阅读(449) | 评论 (0)编辑 收藏

Windows 下java获得文件创建时间的办法 (转)

public static String getFileCreateDate(File _file){
        File file=_file;       
        try{
         Process ls_proc = Runtime.getRuntime().exec("cmd.exe /c dir " + file.getAbsolutePath() + " /tc");
         DataInputStream in = new DataInputStream(ls_proc.getInputStream());
         for (int i = 0; i < 5; i++ )
         {
          in.readLine();
         }
         String stuff = in.readLine();
         StringTokenizer st = new StringTokenizer(stuff);
         String dateC = st.nextToken();
            String  time=st.nextToken();
            in.close();
            return dateC;
         }catch (Exception e){
          return null;
         }
 }

在jdk中,File的操作并没有取得文件创建时间的方法。唯一提供提供的方法是lastModified()返回long值。牺牲创建时间的方法实在是为了满足跨平台的需要。但在windows环境中,需要取得文件创建时间的情况是存在的。
实现的办法是通过windows本地命令行来取得创建日期。以上代码主要取自http://forum.java.sun.com/thread.jspa?threadID=311281&messageID=1247450
但此文提供的原始代码尚有不足,无法解析带有空格的文件夹名,如:C:\\Program files\等,解决办法是在路径前后加上",执行语句变为"cmd.exe /c dir "" + file.getAbsolutePath() + "" /tc"。以上方法返回的是我实际程序需要的数据格式,大家有兴趣可以自行改编

posted @ 2007-10-23 11:20 九宝 阅读(2002) | 评论 (0)编辑 收藏

typedef 的两种用法(转)

typedef是c/c++代码中经常用到的一个关键字. 他的主要做用是给变量类型定义一个别名.
从而达到代码简化, 促进跨平台开发的目的.
下面是typedef的最经常的用法:

typedef struct{
  int a;
  int b;
}MY_TYPE;

这里把一个未命名结构直接取了一个叫MY_TYPE的别名, 这样如果你想定义结构的实例的时候就可以这样:
MY_TYPE tmp;

这是typedef的第一种用法. 比较简单. 就是 typedef 原变量类型 别名
相似的例子:
typedef  unsigned long DWORD;  无符号长型
typedef void far       *LPVOID; //void far *是原变量类型, 表示一个void 型指针(far 在32位系统里面已经没有意义了)
等等

typedef还有第二种用法. 可能这种用法初学者没有接触过.
比如:
typedef int (*MYFUN)(int, int);
这种用法一般用在给函数定义别名的时候.(其实质还是和上面的用法一样的)
上面的例子定义MYFUN 是一个函数指针, 函数类型是带两个int 参数, 返回一个int

在分析这种形式的定义的时候可以用下面的方法:
先去掉typedef 和别名, 剩下的就是原变量的类型.
比如上面的例子:
去掉typedef和MYFUN以后就剩:
int (*)(int, int)

读了我前面一课里面讨论的 <<细说如何确定一个变量的类型>>的朋友应该很容易就得出这个类型指的时是
一个函数指针, 函数类型是带两个int 参数, 返回一个int

posted @ 2007-09-19 15:23 九宝 阅读(208) | 评论 (0)编辑 收藏

how to uncompressing and untarring *.bz2 or *.tgz

If your tarball is compressed with bzip2, run
$ tar xvjf linux-x.y.z.tar.bz2

If it is compressed with GNU zip, run
$ tar xvzf linux-x.y.z.tar.gz

posted @ 2007-09-14 11:47 九宝 阅读(192) | 评论 (0)编辑 收藏

C语言宏定义技巧(转)

C语言宏定义技巧(转)

写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义。。。。。。

 

1,防止一个头文件被重复包含

#ifndef COMDEF_H

#define COMDEF_H

  //头文件内容

#endif

2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。

typedef  unsigned char      boolean;     /* Boolean value type. */

 

typedef  unsigned long int  uint32;      /* Unsigned 32 bit value */

typedef  unsigned short     uint16;      /* Unsigned 16 bit value */

typedef  unsigned char      uint8;       /* Unsigned 8  bit value */

 

typedef  signed long int    int32;       /* Signed 32 bit value */

typedef  signed short       int16;       /* Signed 16 bit value */

typedef  signed char        int8;        /* Signed 8  bit value */

 

 

//下面的不建议使用

typedef  unsigned char     byte;         /* Unsigned 8  bit value type. */

typedef  unsigned short    word;         /* Unsinged 16 bit value type. */

typedef  unsigned long     dword;        /* Unsigned 32 bit value type. */

 

typedef  unsigned char     uint1;        /* Unsigned 8  bit value type. */

typedef  unsigned short    uint2;        /* Unsigned 16 bit value type. */

typedef  unsigned long     uint4;        /* Unsigned 32 bit value type. */

 

typedef  signed char       int1;         /* Signed 8  bit value type. */

typedef  signed short      int2;         /* Signed 16 bit value type. */

typedef  long int          int4;         /* Signed 32 bit value type. */

 

typedef  signed long       sint31;       /* Signed 32 bit value */

typedef  signed short      sint15;       /* Signed 16 bit value */

typedef  signed char       sint7;        /* Signed 8  bit value */

 

3,得到指定地址上的一个字节或字

#define  MEM_B( x )  ( *( (byte *) (x) ) )

#define  MEM_W( x )  ( *( (word *) (x) ) )

4,求最大值和最小值

   #define  MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )

   #define  MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )

5,得到一个field在结构体(struct)中的偏移量

#define FPOS( type, field ) \

/*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */

6,得到一个结构体中field所占用的字节数

#define FSIZ( type, field ) sizeof( ((type *) 0)->field )

7,按照LSB格式把两个字节转化为一个Word

#define  FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )

8,按照LSB格式把一个Word转化为两个字节

#define  FLOPW( ray, val ) \

  (ray)[0] = ((val) / 256); \

  (ray)[1] = ((val) & 0xFF)

9,得到一个变量的地址(word宽度)

#define  B_PTR( var )  ( (byte *) (void *) &(var) )

#define  W_PTR( var )  ( (word *) (void *) &(var) )

10,得到一个字的高位和低位字节

#define  WORD_LO(xxx)  ((byte) ((word)(xxx) & 255))

#define  WORD_HI(xxx)  ((byte) ((word)(xxx) >> 8))

11,返回一个比X大的最接近的8的倍数

#define RND8( x )       ((((x) + 7) / 8 ) * 8 )

12,将一个字母转换为大写

#define  UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )

13,判断字符是不是10进值的数字

#define  DECCHK( c ) ((c) >= '0' && (c) <= '9')

14,判断字符是不是16进值的数字

#define  HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\

                       ((c) >= 'A' && (c) <= 'F') ||\

((c) >= 'a' && (c) <= 'f') )

15,防止溢出的一个方法

#define  INC_SAT( val )  (val = ((val)+1 > (val)) ? (val)+1 : (val))

16,返回数组元素的个数

#define  ARR_SIZE( a )  ( sizeof( (a) ) / sizeof( (a[0]) ) )

17,返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)

#define MOD_BY_POWER_OF_TWO( val, mod_by ) \

           ( (dword)(val) & (dword)((mod_by)-1) )

18,对于IO空间映射在存储空间的结构,输入输出处理

  #define inp(port)         (*((volatile byte *) (port)))

  #define inpw(port)        (*((volatile word *) (port)))

  #define inpdw(port)       (*((volatile dword *)(port)))

  

  #define outp(port, val)   (*((volatile byte *) (port)) = ((byte) (val)))

  #define outpw(port, val)  (*((volatile word *) (port)) = ((word) (val)))

  #define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))

[2005-9-9添加] 

19,使用一些宏跟踪调试

A N S I标准说明了五个预定义的宏名。它们是:

_ L I N E _

_ F I L E _

_ D A T E _

_ T I M E _

_ S T D C _

如果编译不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。记住编译程序

也许还提供其它预定义的宏名。

_ L I N E _及_ F I L E _宏指令在有关# l i n e的部分中已讨论,这里讨论其余的宏名。

_ D AT E _宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。

源代码翻译到目标代码的时间作为串包含在_ T I M E _中。串形式为时:分:秒。

如果实现是标准的,则宏_ S T D C _含有十进制常量1。如果它含有任何其它数,则实现是

非标准的。

可以定义宏,例如:

当定义了_DEBUG,输出数据信息和所在文件所在行

#ifdef _DEBUG

#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)

#else

      #define DEBUGMSG(msg,date) 

#endif

 

20,宏定义防止使用是错误

用小括号包含。

例如:#define ADD(a,b) (a+b)

用do{}while(0)语句包含多语句防止错误

例如:#difne DO(a,b) a+b;\

                   a++;

应用时:if(….)

          DO(a,b); //产生错误

        else

        

解决方法: #difne DO(a,b) do{a+b;\

                   a++;}while(0)

posted @ 2007-09-12 16:55 九宝 阅读(195) | 评论 (0)编辑 收藏

gcc 和g++

gcc :C语言的编译器
g++:C++/C语言的编译器

posted @ 2007-09-06 16:38 九宝 阅读(131) | 评论 (0)编辑 收藏

gcc 和g++

gcc :C语言的编译器
g++:C++/C语言的编译器

posted @ 2007-09-06 16:38 九宝 阅读(128) | 评论 (0)编辑 收藏

C/C++ include预处理指示符 和 gcc的参数 -Idirname

 #include 头文件一般有两种格式
一种是 <>  还有一种是""
如:
 #include <iostream.h>
 #include "myfile.h"

两者的区别在于:
如果文件名用尖括号<>括起来,表示文件是一个标准头文件,查找过程会预定义目录.
如果文件名用一对引号""括起来,表明文件是用户提供的头文件查找该文件时将从当前文件目录开始.

所以用标准头文件时用<>
用自定义的头文件时用""

关于gcc的参数 -Idirname
-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶
A)#include
B)#include “myinc.h”
其中,A类使用尖括号(< >),B类使用双引号(“ ”)。
对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,
而对于B类,cpp在当前目录中搜寻头文件,这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。在程序设计中,如果我们需要的这种包含文件分别分布在不同的目录中,就需要逐个使用-I选项给出搜索路径

posted @ 2007-09-04 14:36 九宝 阅读(1526) | 评论 (0)编辑 收藏

关于SAX,DOM,JAXP,JDOM,DOM4J的一些理解

第一:首先介绍一下SAX,DOM,JAXP,JDOM,DOM4J的基本知识:
1、sax、dom是两种对xml文档进行分析的方法(没有具体的实现,只有接口)
所以不是解释器,如果光有他们,你是完成不了对xml文档的处理的。
sax的包是org.xml.sax
dom的包是org.w3c.dom
包的名称很重要,它有助于你理解他们之间的关系。

2、jaxp是api,他封装了sax\dom两种接口。并在sax\dom的基础之上,作了一套比较简单的api以供开发人员使用。
jaxp的包是javax.xml.parsers
可以看看jaxp的源文件,它的文件中包含了对sax或者dom的引用(import)
jaxp也不是具体的实现,他只是一套api。如果你仅仅有jaxp那是无法工作的
(其实jaxp只是完成对sax、dom的包装,生成了DocumentBuilderFactory\DocumentBuilder
和SAXParserFactory SAXParser。也就是设计模式中的工厂模式,他的好处就是具体的对象( 解释器)建立由子类完成)

3、xerces解释器(号称地球上最快的xml解释器)
在xerces中对jaxp中定义的SAXParser SAXParserFactory DocumentBuilder DocumentBuilderFactory进行了继承(extends)对应SAXParserImpl SAXParserFactoryImpl DocumentBuilderImpl DocumentBuilderFactoryImpl
这就是为什么你的classpath中只要有xerces.jar(其中包含了sax dom jaxp )和 xercesImpl.jar就可以的原因了.

4、什么时候可以用别的解释器 比如crimson呢
他也是和xerces一样 是解释器,很简单,用crimson.jar 替代xercesImpl.jar

5、jdom和dom4j
W3C的DOM标准API难用的让人想撞墙,于是有一帮人开发Java专用的XML API目的是为了便于使用,这就是jdom的由来,开发到一半的时候,另一部分人又分了出来,他们有自己的想法,于是他们就去开发dom4j,形成了今天这样两个API,至于他们之间的性能,jdom全面惨败,dom4j大获全胜。我觉得jdom和dom4j就相当于sax/dom+jaxp,具体的解释器可以选择。

第二:再介绍一下,dom,sax,jdom,dom4j的技术特点:

1: DOM
DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM 是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。
  另一方面,对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这样的数据会更好。这些基于事件的模型,比如 SAX。

2:SAX
  这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。

3: 选择 DOM 还是选择 SAX ?
  对于需要自己编写代码来处理 XML 文档的开发人员来说,选择 DOM 还是 SAX 解析模型是一个非常重要的设计决策。
  DOM 采用建立树形结构的方式访问 XML 文档,而 SAX 采用的事件模型。
  DOM 解析器把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。用 DOM 解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档,所以对性能和内存的要求比较高,尤其是遇到很大的 XML 文件的时候。由于它的遍历能力,DOM 解析器常用于 XML 文档需要频繁的改变的服务中。
  SAX 解析器采用了基于事件的模型,它在解析 XML 文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。

4:jdom http://www.jdom.org
JDOM 的目的是成为 Java 特定文档模型,它简化与 XML 的交互并且比使用 DOM 实现更快。由于是第一个 Java 特定模型,JDOM 一直得到大力推广和促进。正在考虑通过“Java 规范请求 JSR-102”将它最终用作“Java 标准扩展”。从 2000 年初就已经开始了 JDOM 开发。
  JDOM 与 DOM 主要有两方面不同。首先,JDOM 仅使用具体类而不使用接口。这在某些方面简化了 API,但是也限制了灵活性。第二,API 大量使用了 Collections 类,简化了那些已经熟悉这些类的 Java 开发者的使用。
  JDOM 文档声明其目的是“使用 20%(或更少)的精力解决 80%(或更多)Java/XML 问题”(根据学习曲线假定为 20%)。JDOM 对于大多数 Java/XML 应用程序来说当然是有用的,并且大多数开发者发现 API 比 DOM 容易理解得多。JDOM 还包括对程序行为的相当广泛检查以防止用户做任何在 XML 中无意义的事。然而,它仍需要您充分理解 XML 以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习 DOM 或 JDOM 接口都更有意义的工作。
  JDOM 自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档(尽管它还可以将以前构造的 DOM 表示作为输入)。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档。JDOM 是在 Apache 许可证变体下发布的开放源码。

5: DOM4J   http://dom4j.sourceforge.net/
 虽然 DOM4J 代表了完全独立的开发结果,但最初,它是 JDOM 的一种智能分支。它合并了许多超出基本 XML 文档表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过 DOM4J API 和标准 DOM 接口具有并行访问功能。从 2000 下半年开始,它就一直处于开发之中。
  为支持所有这些功能,DOM4J 使用接口和抽象基本类方法。DOM4J 大量使用了 API 中的 Collections 类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然 DOM4J 付出了更复杂的 API 的代价,但是它提供了比 JDOM 大得多的灵活性。
  在添加灵活性、XPath 集成和对大文档处理的目标时,DOM4J 的目标与 JDOM 是一样的:针对 Java 开发者的易用性和直观操作。它还致力于成为比 JDOM 更完整的解决方案,实现在本质上处理所有 Java/XML 问题的目标。在完成该目标时,它比 JDOM 更少强调防止不正确的应用程序行为。
  DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。

最后:我建议用dom4j

 JDOM 和 DOM 在性能测试时表现不佳,在测试 10M 文档时内存溢出。在小文档情况下还值得考虑使用 DOM 和 JDOM。虽然 JDOM 的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM 仍是一个非常好的选择。DOM 实现广泛应用于多种编程语言。它还是许多其它与 XML 相关的标准的基础,因为它正式获得 W3C 推荐(与基于非标准的 Java 模型相对),所以在某些类型的项目中可能也需要它(如在 javascript 中使用 DOM)。
  SAX表现较好,这要依赖于它特定的解析方式。一个 SAX 检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
  无疑,DOM4J是最好的,目前许多开源项目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 来读取 XML 配置文件。如果不考虑可移植性,那就采用DOM4J吧!

四种xml操作方式的基本使用方法:

?xml version="1.0" encoding="GB2312"?
RESULT

VALUE

   NO苏A88888/NO

   ADDR>南京市新街口10号/ADDR

/VALUE

VALUE

   NO苏A99999/NO

   <ADDR>南京市山西路20号/ADDR

/VALUE

/RESULT


1
DOM

import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;

public class MyXMLReader{
 
public static void main(String arge[]){

  
long lasting =System.currentTimeMillis();
  
try{
   
File f=new File("data_10k.xml");
   
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
   
DocumentBuilder builder=factory.newDocumentBuilder();
   
Document doc = builder.parse(f);
   
NodeList nl = doc.getElementsByTagName("VALUE");
   for (int i=0;i
nl.getLength();i++){
    System.out.print("车牌号码
:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
    System.out.println("车主地址
:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
   
}
  
}catch(Exception e){
   
e.printStackTrace();
}

2
SAX

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

public class MyXMLReader extends DefaultHandler {

 
java.util.Stack tags = new java.util.Stack();
 
public MyXMLReader() {
  
super();
}

 
public static void main(String args[]) {
  
long lasting = System.currentTimeMillis();
  
try {
   
SAXParserFactory sf = SAXParserFactory.newInstance();
   
SAXParser sp = sf.newSAXParser();
   
MyXMLReader reader = new MyXMLReader();
   
sp.parse(new InputSource("data_10k.xml"), reader);
  
} catch (Exception e) {
   
e.printStackTrace();
  
}

  System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒
");}
  
public void characters(char ch[], int start, int length) throws SAXException {
  
String tag = (String) tags.peek();
  
if (tag.equals("NO")) {
   System.out.print("车牌号码:
" + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
  System.out.println("地址
:" + new String(ch, start, length));
}
}

  
public void startElement(String uri,String localName,String qName,Attributes attrs) {
  
tags.push(qName);}
}

3
JDOM

import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;

public class MyXMLReader {

 
public static void main(String arge[]) {
  
long lasting = System.currentTimeMillis();
  
try {
   
SAXBuilder builder = new SAXBuilder();
   
Document doc = builder.build(new File("data_10k.xml"));
   
Element foo = doc.getRootElement();
   
List allChildren = foo.getChildren();
   for(int i=0;i
allChildren.size();i++) {
    System.out.print("车牌号码
:" + ((Element)allChildren.get(i)).getChild("NO").getText());
    System.out.println("车主地址
:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
   
}
  
} catch (Exception e) {
   
e.printStackTrace();
}

}

4
DOM4J

import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;

public class MyXMLReader {

 
public static void main(String arge[]) {
  
long lasting = System.currentTimeMillis();
  
try {
   
File f = new File("data_10k.xml");
   
SAXReader reader = new SAXReader();
   
Document doc = reader.read(f);
   
Element root = doc.getRootElement();
   
Element foo;
   
for (Iterator i = root.elementIterator("VALUE"); i.hasNext() {
    
foo = (Element) i.next();
    System.out.print("车牌号码
:" + foo.elementText("NO"));
    System.out.println("车主地址
:" + foo.elementText("ADDR"));
   
}
  
} catch (Exception e) {
   
e.printStackTrace();
}
)

posted @ 2007-08-09 14:02 九宝 阅读(590) | 评论 (0)编辑 收藏

FOAF-a-Matic(转)

Introduction

FOAF-a-matic 是一個簡單的 Javascript 應用程式。它讓你能夠建立關於你自己的 FOAF("Friend-of-A-Friend")檔案。你可以參考 Edd Dumbill 的文章:「XML 观察:使用 XML 和 RDF 找到朋友」,拜訪RDFWeb 的 FOAF 首頁,以及FOAF 的詞彙描述(FOAF vocabulary description)

簡單地說,FOAF 是一種用 XML 跟 RDF 描述你自己的方式:你的名字、電子郵件信箱,以及你的朋友們。 這種方式使其可以被軟體處理,舉例來說可為搜尋引擎所利用,自動化地發現社群與你的資訊。 FOAF 具有帶動線上社群許多有趣發展的潛力。Ben Hammersely 的英國衛報文章 "Click to the Clique" 提供 關於這些想法的更進一步探討。

FOAF-a-Matic 被用來提供一個簡單、快速的方式,產生你自己的 FOAF 檔案。最基本你至少需要提供你的 名字與 email 地址,並且你可以增加任何你想加入的朋友。把朋友加入 FOAF 檔案中是很重要的(當然想 寫下多少朋友看你高興啦),因為當 FOAF 彙整器索引你的 FOAF 描述時,他們將會自動把你們一起綁成 一群個體之間的網絡關係。

備註:在本頁你所輸入的所有資訊,都不會被存下來或被使用。全部的處理過程全部都是在客戶端進行, 以確保你的隱私權。

如果你對這個應用有任何的意見,或者關於 FOAF 的進一步問題,為什麼不參加RDFWeb-dev 的通訊論壇

最新消息:我目前正在撰寫一套建立與管理個人 FOAF 資料的桌面應用程式,FOAF-a-Matic Mark 2 a

表單

個人資訊

某些你個人的資訊,以及其他人如何和你聯絡。

稱謂(Mr, Mrs, Dr, etc)
名字
姓 (Family/Given)
暱稱
電子郵件地址
首頁
你的照片
電話號碼

工作資訊

關於你工作所在的資訊。

工作所在首頁
在你的工作脈絡中的介紹網頁

學校

你是哪裡畢業的?

學校首頁

你所認識的朋友

告訴 FOAF-a-matic 你所認識的朋友。按下「加入更多朋友」,可以增加空白欄位,輸入更多你所認識朋友的資訊。 如果你的朋友已經有了 FOAF 檔案,請把該檔案連結的資訊(URL)輸入在「SeeAlso」的欄位中。

Friend-- Name Email See Also
Friend-- Name Email See Also
Friend-- Name Email See Also
Friend-- Name Email See Also

產生結果

現在你已經輸入了這些資料。你已經可以轉成 FOAF 檔案了。

保護電子郵件地址,避免被濫發垃圾郵件

接下來呢?

讓別人知道你的 FOAF 檔案

這個部分最簡單。只要將產生出來的 FOAF 檔案從剛剛的文字區複製,貼到一個檔案裡。將這個檔案擺在你的網站中, 可以讓所有的人公開下載;建議將檔案名稱取名為 foaf.rdf,然後 google 的搜尋機器人就會自動取用它,並且還會 用它自動發現網路上其他的 FOAF 檔案。

你的 FOAF 檔案現在已經好了。現在只需要其他人來拜訪並且開始閱讀它...

加入 FOAF 的社群

FOAF 的「查詢」問題(舉例來說,FOAF 相關的應用程式如何發現你的 FOAF 檔案)目前仍然尚待討論。如果你有任何 的建議,請送到 RDFWeb-dev 通訊論壇。然而有三種可 能的方法加入社群,你可以自己試試看:

使用 link 這個標籤

Aaron Swartz 曾經建議使用 HTML 的 link 標籤來指向 FOAF 檔案;這種做法和一般部落格的作者們指向他們的 RSS 檔案的方式是相同的。寫法應該像 是下面的樣子:

<link rel="meta" type="application/rdf+xml" title="FOAF" href="foaf.rdf" />

從朋友的 FOAF 檔案指過來

另外一種推薦的方式,是請別人(也就是你的朋友)在他們的 FOAF 檔案中標記你的 FOAF 檔案。一個 FOAF 的蜘 蛛(搜尋代理程式)可以梭巡所有互相標記關聯的 FOAF 檔案。你可以依照下列做法修改 FOAF 檔案:

  1. 修改 rdf:RDF 元素,如下增加 RDF Schema namespace: <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  2. 然後透過加入 rdfs:seeAslo 的敘述,增加指向其他的 FOAF 檔案的鏈結: <rdfs:seeAlso rdf:resource="http://www.example.com/friends.xrdf"/> <rdfs:seeAlso rdf:resource="http://www.ldodds.com/webwho.xrdf"/>

最新消息:如果你的朋友們已經有了一個 FOAF 檔案,那麼請把它加在上面表單 seeAlso 的欄位中。你也可以推薦朋友 來使用 FOAF-a-matic

使用 FOAF 告示板

一個查詢 FOAF 檔案最直接的方式,就是有一個所有人的註冊中心。我用一個簡單的方式來進行, 叫做 FOAF 公佈欄(FOAF Bulletin Board)。你只需要瀏 覽 FOAFWiki,並且編輯 FOAFBulletinBoard 的網頁,把你的名字與連到你的 FOAF 檔案的連結加入到網頁中。你可以 使用我已經加入的資料做為範例,在公佈欄頁面中加入你的資料。

使用 HTML Tidy 與 XSLT 的魔法,意味著例如 Edd Dumbill 的 FOAFbot 這樣的應用程式可以處理這個索引檔案。請瀏覽 FOAFBot 的首頁關於如何看它發揮作用。

posted @ 2007-08-09 13:30 九宝 阅读(300) | 评论 (0)编辑 收藏

仅列出标题
共9页: 上一页 1 2 3 4 5 6 7 8 9 下一页