存档: 标签: ‘XML’

DhtmlxGrid Quick Start Guide

没有评论 2011年7月19日

说明:本文来源于http://dhtmlx.com/docs/products/dhtmlxGrid/,本人对其进行翻译整理成下文,贴出此文,紧供分享。

dhtmlxGrid是一个拥有强大的数据绑定、优秀的大数据展示性能并支持ajax的JavaScript表格控件。该组件易于使用并通过富客户端的API提供了很大的扩展性。dhtmlxGrid支持不同的数据源(XML, JSON, CSV, JavaScript 数组和HTML表格),如果需要的话,还可以从自定义的xml中加载数据。

  • 跨浏览器
  • 使用JavaScript API进行控制
  • Ajax支持
  • 简单的JavaScript 或者XML 配置
  • 与HTML集成
  • 内建过滤、排序、查询、分组功能
  • 表格 footer/header自动计算
  • 行内编辑
  • 准备使用大数据集解决方案:分页,动态加载,智能渲染
  • 序列化为XML或CSV
  • 从 XML或CSV加载
  • 列锁定
  • 剪贴板支持
  • 简单的客户端到服务器端配置 (使用 dhtmlxConnector, 可用于 PHP, Java, .NET, ColdFusion)
  • 支持子表格
  • 列拖拽和移动
  • 行或列拖拽
  • dhtmlxTree PRO Edition支持拖拽
  • 可以创建一个编辑器或是列格式化 (使用 eXcell – 继承自 cell 对象)
  • 组合框,日历以及更多的预定义eXcells
  • Cell支持数学方程式
  • 不同的键盘映射
  • 简单的CSS风格或是预定义的皮肤
  • 对于rows/entire grid不可见的数据块 (用户数据)
  • 客户端排序(string, integer, date, custom)
  • 服务器端排序
  • 广泛的事件处理

继续阅读…

You are my love

1条评论 2010年10月8日

今天看nutz的源码,看到了yaml,觉得很新鲜,what is yaml?百度一下,从百科里找到了答案: 在小说《拜金女的恋爱方程式》中,YAML 是You are my love 的缩写。

YAML

来自YAML官方网站 (http://www.yaml.org/) 的定义: YAML是一种直观的能够被电脑识别的的数据数据序列化格式,他并且容易被人类阅读,容易和脚本语言交互的。换种说法,YAML是一种很简单的类似于 XML的数据描述语言,语法比XML简单很多。他在描述能够被转化成数组或hash的数据是很有用,例如: 继续阅读…

Commons-Digester read xml to JavaBean

没有评论 2010年4月17日

最近在做一个小项目,需要读取数据字典XML中的内容取出相应的配置信息,在前台用Extjs生成一个查询框架,刚开始我是自己利用dom的开源lib以SAX的方式读数据字典,生成相应的java对象,但总感觉自己写的读取方法不是很完美,所以想在网上找找更好的解决办法。百度一下,看到了 Commons-Digester这个开源的jar文件,Digester本来仅仅是Jakarta Struts中的一个工具,用于处理struts-config.xml配置文件,后来就独立出来用于解析XML文件。

Digester由”事件”驱动,通过调用预定义的规则操作对象栈,将XML文件转换为Java对象。工作原理如下:
Digester底层采用SAX解析XML文件,所以很自然的,对象转换由”事件”驱动,即在识别出特定XML元素时(实际被细分为begin、 body、end、finish四个时点),将执行特定的动作,比如创建特定的Java对象,或调用特定对象的方法等。此处的XML元素根据匹配模式 (matching pattern)识别,而相关操作由规则(rule)定义。在转换过程中,Digester维持了一个对象栈,可以看作对象转换的工作台,用来存放转换中生成的、或是为转换临时创建的Java对象。对输入XML文件作了一趟完整的扫描后,对象栈的栈顶元素即为目标对象。由于Digester屏蔽了SAX解析的细节,使用者仅需关注转换操作本身,大大简化了转换操作。

使用Digester,基本步骤如下:
1.创建Digester对象实例。
2.设置该Digester对象的配置属性(可选)。
3.将需要的初始对象 push到该Digester对象的对象栈上(可选)。
4.需要注册所有的XML元素匹配模式与处理规则之间的映射关系。
5.用 digester.parse()解析的XML文档对象,得到目标对象。

在了解了Digester的实现原理和解析方式,就寻找网上现成的例子,自己在电脑上实现了一遍,由于网上的例子大多都不详细,所以在测试的过程中不断出现一些异常,但又不知道问题出自哪里、如何解决 :cry:
最后终于找到了一个比较详细的实例,呵呵
以下是一个测试方法,其它的代码没有贴出,如有需要可以告诉我:

package com.javachen.xml.digester;

import java.io.File;
import java.io.IOException;
import org.junit.Test;
import org.xml.sax.SAXException;

import org.apache.commons.digester.Digester;

import static org.junit.Assert.*;

public class DigesterTest {

	/**
	 * 属性方式
	 */
	@Test
	public void testOne() {
		Digester digester = new Digester();
		// 设置不进行合法性验证
		digester.setValidating(false);
		// 当遇到<teacher>时创建一个Teacher对象,放入栈顶
		digester.addObjectCreate("teacher", Teacher.class);
		digester.addSetProperties("teacher");
		// 当遇到<teacher>的子元素<student>时创建一个Student对象,放入栈顶
		digester.addObjectCreate("teacher/student", Student.class);
		// 设置<student>的属性值,根据属性值调用相应的set方法
		digester.addSetProperties("teacher/student");
		// 当再次遇到<student>时创建一个Student对象,放入栈顶,
                //同时调用栈次顶的addStudent方法
		digester.addSetNext("teacher/student", "addStudent",
				"com.javachen.xml.digester.Student");
		try {
			Teacher teacher = (Teacher) digester.parse(new File(
					"src/com/javachen/xml/digester/student.xml"));
			assertEquals(8, teacher.getStudents().size());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 子标签方式(设置Property方式一)
	 */
	@Test
	public void testTwo() {
		Digester digester = new Digester();
		digester.setValidating(false);
		// 设置栈顶
		digester.push(new TeacherList());
		digester.addObjectCreate("teachers/teacher", Teacher.class);
		digester.addSetProperties("teachers/teacher");
		digester.addObjectCreate("teachers/teacher/student", Student.class);
//		digester.addSetProperties("teachers/teacher/student");
		// 子标签方式设置属性方法之一,第三个参数是第二个参数所指方法的参数个数
		digester.addCallMethod("teachers/teacher/student/name", "setName", 1);
		digester.addCallMethod("teachers/teacher/student/age", "setAge", 1);
		digester.addCallMethod("teachers/teacher/student/id", "setId", 1);
		digester.addSetNext("teachers/teacher/student", "addStudent",
				"com.javachen.xml.digester.Student");
		digester.addSetNext("teachers/teacher", "addTeachers",
				"com.javachen.xml.digester.Teacher");
		try {
			TeacherList teacher = (TeacherList) digester.parse(new File(
					"src/com/javachen/xml/digester/teacher.xml"));
			assertEquals(2, teacher.getTeachers().size());
			assertEquals("java", teacher.getTeachers().get(0).getCourse());
			assertEquals(8, teacher.getTeachers().get(0).getStudents().size());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 子标签方式(设置Property方式二)
	 */
	@Test
	public void testThree() {
		Digester digester = new Digester();
		digester.setValidating(false);
		// 设置栈顶
		digester.push(new TeacherList());
		digester.addObjectCreate("teachers/teacher", Teacher.class);
		digester.addSetProperties("teachers/teacher");
		digester.addObjectCreate("teachers/teacher/student", Student.class);
		// 子标签方式设置属性方法之二
		digester.addBeanPropertySetter("teachers/teacher/student/name");
		digester.addBeanPropertySetter("teachers/teacher/student/age");
		digester.addBeanPropertySetter("teachers/teacher/student/id");
		digester.addSetNext("teachers/teacher/student", "addStudent",
				"com.javachen.xml.digester.Student");
		digester.addSetNext("teachers/teacher", "addTeachers",
				"com.javachen.xml.digester.Teacher");
		try {

			TeacherList teacher = (TeacherList) digester.parse(new File(
					"src/com/javachen/xml/digester/teacher.xml"));
			assertEquals(2, teacher.getTeachers().size());
			assertEquals("java", teacher.getTeachers().get(0).getCourse());
			assertEquals(8, teacher.getTeachers().get(0).getStudents().size());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 子标签方式 (callMethod callParam方式)
	 */
	@Test
	public void testFour() {
		Digester digester = new Digester();
		digester.setValidating(false);
		digester.push(new TeacherList());
		digester.addObjectCreate("teachers/teacher", "com.javachen.xml.digester.Teacher");
		digester.addSetProperties("teachers/teacher");
		// 当<student>时调用栈顶元素(Teacher)的addStudents却并不执行,
               //等待addCallParam设置参数,3为参数个数,这里传入的参数是字符串。
		digester.addCallMethod("teachers/teacher/student", "addStudent", 3);
		digester.addCallParam("teachers/teacher/student/name", 0);
		digester.addCallParam("teachers/teacher/student/age", 1);
		// 这句之后即</student>才调用addStudents方法,并且如果再次遇到<student>重复。
		digester.addCallParam("teachers/teacher/student/id", 2);
		digester.addSetNext("teachers/teacher", "addTeachers",
				"com.javachen.xml.digester.Teacher");
		try {
			TeacherList teacher = (TeacherList) digester.parse(new File(
					"src/com/javachen/xml/digester/teacher.xml"));
			assertEquals(2, teacher.getTeachers().size());
			assertEquals("java", teacher.getTeachers().get(0).getCourse());
			assertEquals(8, teacher.getTeachers().get(0).getStudents().size());
			assertEquals("李世民2", teacher.getTeachers().get(1).getStudents()
					.get(2).getName());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}
	}
}

Xmappr开源项目研读

没有评论 2010年1月26日

一个偶然的点击发现了一个使用纯Java编写的处理XML的类库,里面涉及了java底层的一些知识,包括反射、泛型、注释等等。决定从这个小框架的研究开始学习java jdk的底层知识。 继续阅读…

用JDOM操作XML文件

没有评论 2009年12月9日

JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。

Java + XML = JDOM !

JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。

Jdom是用Java语言读、写、操作XML的新API函数。Jason Hunter 和 Brett McLaughlin公开发布了它的1.0版本。在直觉、简单和高效的前提下,这些API函数被最大限度的优化。在接下来的篇幅里将介绍怎么用Jdom去读写一个已经存在的XML文档。

继续阅读…

在Dom4j中使用xpath解析xml

没有评论 2009年10月30日

公司项目解析xml使用的是SAX(Stream API for XML)解析xml数据字典。关于SAX,Simple API for XML(简称SAX)是个循序存取XML的解析器API。SAX提供一个机制从XML文件读取资料。它是除了文档对象模型(DOM)的另外一种流行选择。

优点
SAX解析器在某些方面优于DOM风格解析器。SAX解析器的内存使用量一般远低于DOM解析器使用量。DOM解析器在任何处理开始之前,必须把整棵树放在内存,所以DOM解析器的内存使用量完全根据输入资料的大小。相对来说,SAX解析器的内存内容,是只基于XML档案的最大深度(XML树的最大深度)和单一XML项目上XML属性储存的最大资料。这两个总是比整颗解析树本身还小。
因为SAX事件驱动的本质,处理文件通常会比DOM风格的解析器快。内存存取耗时,所以DOM较大的内存
使用也是一个效能议题。
因为SAX的本质,从磁盘串流读取是可行的。无法放入内存的XML文件只可能使用SAX解析器(或另外的
串流XML解析器)来处理。

缺点
SAX事件驱动的模型对于XML解析很有用,但它确实有某些缺点。
某些种类的XML验证需要存取整份文件。例如,一个DTDIDREF 属性需要文件内有项目使用指定字串当成
DTD ID属性。要在SAX解析器内验证,必须追踪每个之前遇过的ID和IDREF属性,检查是否有任何相符。
更甚者,一个IDREF不符合ID,使用者只会在整份文件都解析完后才发现,若这种连结对于建立有效输
出是重要的,那浪费在处理整份文件的时间只能舍弃。
另外,某些XML处理仅要求存取整份文件。举例来说,XSLT及XPath需要能够任何时间存取任何解析过的
XML树。当SAX以用来建构此树时,DOM解析器在设计上已经是如此了。
继续阅读…