??xml version="1.0" encoding="utf-8" standalone="yes"?> 研究发现Q属性(变量Q可分ؓ三类Q对象属性、全局变量和局部变量) “cd部(对内不对外)”调用?/p>
JS函数的声明与讉K原理 <script type="text/javas <script type="text/javas
毫无疑问Q这在GBK~码的页面访问、提交数据时是没有ؕ码问题的。但是遇到Ajax׃一样了。Ajax强制中文内容进行UTF-8~码Q这样导致进入后端后使用GBKq行解码时发生ؕ码。网上的所谓的l极解决Ҏ都是扯E或者过于复杂,例如下面的文章: q样的文章很多,昄Q?/p>
如果提交数据的时候能够告诉后端传输的~码信息是否可以避免这U问题?比如Ajaxh告诉后端是UTF-8Q其它请求告诉后端是GBKQ这样后端分别根据指定的~码q行解码是不是就解决问题了?/p>
有两个问题: 解决了上q问题,来看具体实现Ҏ?列一DJava代码Q?/p> 解释下: 正则表达式用于字W串处理Q表单验证等场合Q实用高效,但用到时L不太把握Q以致往往要上|查一番。我一些常用的表达式收藏在q里Q作备忘之用。本贴随时会更新?br /> 匚w双字节字W?包括汉字在内)Q?/p>
应用Q计字W串的长度(一个双字节字符长度?QASCII字符?Q?/p>
匚wI的正则表辑ּQ?/p>
匚wHTML标记的正则表辑ּQ?/p>
匚w首尾I格的正则表辑ּQ?/p>
应用Qj avascript中没有像v bscript那样的trim函数Q我们就可以利用q个表达式来实现Q如下: 利用正则表达式分解和转换IP地址 不过上面的程序如果不用正则表辑ּQ而直接用split函数来分解可能更单,E序如下Q?/p>
匚wEmail地址的正则表辑ּQ?/p>
匚w|址URL的正则表辑ּQ?/p>
利用正则表达式去除字串中重复的字W的法E序Q[*注:此程序不正确] *?br />=============================== 我原来在CSDN上发贴寻求一个表辑ּ来实现去除重复字W的ҎQ最l没有找刎ͼq是我能惛_的最单的实现Ҏ。思\是用后向引用取出包括重复的字符Q再以重复的字符建立W二个表辑ּQ取C重复的字W,两者串q。这个方法对于字W顺序有要求的字W串可能不适用?/p>
得用正则表达式从URL地址中提取文件名的javascriptE序Q如下结果ؓpage1 利用正则表达式限制网表单里的文本框输入内容Q?/p>
用正则表辑ּ限制只能输入中文Q?/p>
用正则表辑ּ限制只能输入全角字符Q?/p>
用正则表辑ּ限制只能输入数字Q?/p>
用正则表辑ּ限制只能输入数字和英文: 匚w非负整数Q正整数 + 0Q?/p>
匚w正整?/p>
匚w非正整数Q负整数 + 0Q?/p>
匚w负整?/p>
匚w整数 匚w非负点敎ͼ正QҎ + 0Q?/p>
匚w正QҎ 匚w非正点敎ͼ负QҎ + 0Q?/p>
匚w负QҎ 匚w点?/p>
匚w?6个英文字母组成的字符?/p>
匚w?6个英文字母的大写l成的字W串 匚w?6个英文字母的写l成的字W串 匚w由数字和26个英文字母组成的字符?/p>
匚w由数字?6个英文字母或者下划线l成的字W串 匚wemail地址 匚wurl 匚whtml tag Visual Basic & C# Regular Expression [Visual Basic] [C#] 2.清理输入字符?br />下面的代码示例用静?Regex.Replace Ҏ从字W串中抽出无效字W。您可以使用q里定义?CleanInput ҎQ清除掉在接受用戯入的H体的文本字D中输入的可能有害的字符。CleanInput 在清除掉?@?Q连字符Q和 .Q句点)以外的所有非字母数字字符后返回一个字W串?/p>
[Visual Basic] [C#] 3.更改日期格式 [Visual Basic] [C#] Regex 替换模式 有几U静态函C您可以在使用正则表达式操作时无需创徏昑ּ正则表达式对象,?Regex.Replace 函数正是其中之一。如果您不想保留~译的正则表辑ּQ这给您带来方?/p>
4.提取 URL 信息 [Visual Basic] [C#] 只有字母和数字,不小?位,且数字字母都包含的密码的正则表达?br />在C#中,可以用这个来表示Q?/p>
一个将需要将路径字符串拆分ؓ根目录和子目录两部分的算法程序,考虑路径格式有:C:\aa\bb\cc Q\\aa\bb\cc Q?ftp://aa.bb/cc 上述路径分别被拆分为:C:\和aa\bb\cc Q\\aa ?\bb\cc Q?ftp:// ?aa.bb/cc 用javascript实现如下Q?/p>
对象属性:声明时以“this.”开_只能?#8220;cȝ实例”卛_象所调用Q不能被“cd部(对外不对内)”调用Q全局变量Q声明时直接以变量名开_可以L调用Q对内对外)Q局部变量:只能?/p>
//c?nbsp;
var testClass = function(){
//对象属?对外不对?c调?
this.age ="25";
//全局变量(对内对外)
name="jack";
//局部变?对内不对?
var address = "beijing";
//全局函数Q对内对外)
add = function(a,b){
//可访问:全局变量和局部变?nbsp;
multiply(a,b);
return a+b;
}
//实例函数Q由cȝ对象调用Q?nbsp;
this.minus = function(a,b){
//可以讉KQ对象属性、全局变量和局部变?nbsp;
return a-b;
}
//局部函敎ͼ内部直接调用Q?nbsp;
var multiply = function(a,b){
//只能讉KQ全局变量和局部变?nbsp;
return a*b;
}
}
//cd敎ͼq名直接调用)
testClass.talk= function(){
//只能讉KQ全局变量和全局函数
this.what = function(){
alert("What can we talk about?");
about();
}
var about = function(){
alert("about nameQ?+name);
alert("about add(1,1):"+add(1,1));
}
}
//原型函数(q的对象调?
testClass.prototype.walk = function(){
//只能讉K:全局变量和全局函数
this.where = function(){
alert("Where can we go?");
go();
}
var go = function(){
alert("go name:"+name);
alert("go add(1,1):"+add(1,1));
}
}
</script>
下面看看如何调用:
//获取一个cbscȝ实例
var cbs= new testClass();
//调用cȝ对象属性age
alert("age:"+cbs.age);
//获取cd数talk的实?nbsp;
var talk = new testClass.talk();
//调用cd数的实例函数
talk.what();
//获取原型函数walk的实?nbsp;
var walk = new cbs.walk();
//调用原型函数的实例函?nbsp;
walk.where();
</script>
]]><filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.ClassUtils;
import org.springframework.web.filter.OncePerRequestFilter;
/** 自定义编码过滤器
* @author imxylz (imxylz#gmail.com)
* @sine 2011-6-9
*/
public class MutilCharacterEncodingFilter extends OncePerRequestFilter {
static final Pattern inputPattern = Pattern.compile(".*_input_encode=([\\w-]+).*");
static final Pattern outputPattern = Pattern.compile(".*_output_encode=([\\w-]+).*");
// Determine whether the Servlet 2.4 HttpServletResponse.setCharacterEncoding(String)
// method is available, for use in the "doFilterInternal" implementation.
private final static boolean responseSetCharacterEncodingAvailable = ClassUtils.hasMethod(HttpServletResponse.class,
"setCharacterEncoding", new Class[] { String.class });
private String encoding;
private boolean forceEncoding = false;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String url = request.getQueryString();
Matcher m = null;
if (url != null && (m = inputPattern.matcher(url)).matches()) {//输入~码
String inputEncoding = m.group(1);
request.setCharacterEncoding(inputEncoding);
m = outputPattern.matcher(url);
if (m.matches()) {//输出~码
response.setCharacterEncoding(m.group(1));
} else {
if (this.forceEncoding && responseSetCharacterEncodingAvailable) {
response.setCharacterEncoding(this.encoding);
}
}
} else {
if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
request.setCharacterEncoding(this.encoding);
if (this.forceEncoding && responseSetCharacterEncodingAvailable) {
response.setCharacterEncoding(this.encoding);
}
}
}
filterChain.doFilter(request, response);
}
public void setEncoding(String encoding) {
this.encoding = encoding;
}
public void setForceEncoding(boolean forceEncoding) {
this.forceEncoding = forceEncoding;
}
}
]]>
]]>
匚w中文字符的正则表辑ּQ?/p>
{
return
this
.
replace
(
/
(^\s*)|(\s*$)
/g
,
""
)
;
}
下面是利用正则表辑ּ匚wIP地址QƈIP地址转换成对应数值的JavascriptE序Q?/p>
{
re
=
/
(\d+)\.(\d+)\.(\d+)\.(\d+)
/g
//匚wIP地址的正则表辑ּ
if
(
re
.
test
(
ip
))
{
return
RegExp
.$
1
*
Math
.
pow
(
255
,
3
)
)+
RegExp
.$
2
*
Math
.
pow
(
255
,
2
)
)+
RegExp
.$
3
*
255
+
RegExp
.$
4
*
1
}
else
{
throw
new
Error
(
"
Not a valid IP address!
"
)
}
}
ip
=
ip
.
split
(
"
.
"
)
alert
(
"
IP值是Q?/span>
"
+
(
ip
[
0
]
*
255
*
255
*
255
+
ip
[
1
]
*
255
*
255
+
ip
[
2
]
*
255
+
ip
[
3
]
*
1
))
var
s1
=
s
.
replace
(
/
(.).*\1
/g
,
"
$1
"
)
var
re
=
new
RegExp
(
"
[
"
+
s1
+
"
]
"
,
"
g
"
)
var
s2
=
s
.
replace
(
re
,
""
)
alert
(
s1
+
s2
)
//l果为:abcefgi
如果var s = “abacabefggeeii?br />l果׃对了Q结果ؓQabeicfgg
正则表达式的能力有限
===============================
s
=
s
.
replace
(
/
(.*
\/
){ 0, }([^\.]+).*
/i
g
,
"
$2
"
)
alert
(
s
)
1.认有效电子邮g格式
下面的示例用静?Regex.IsMatch Ҏ验证一个字W串是否为有效电子邮件格式。如果字W串包含一个有效的电子邮g地址Q则 IsValidEmail Ҏq回 trueQ否则返?falseQ但不采取其他Q何操作。您可以使用 IsValidEmailQ在应用E序地址存储在数据库中或昄?ASP.NET 中之前Q筛选出包含无效字符的电子邮件地址?/p>
' Return true if strIn is in valid e-mail format.
Return Regex.IsMatch(strIn, ("^([\w-\.]+)@((\[[0-9]{ 1,3 }\.[0-9]{ 1,3 }\.[0-9]{ 1,3 }\.)|(([\w-]+\.)+))([a-zA-Z]{ 2,4 }|[0-9]{ 1,3 })(\]?)$")
End Function
{
// Return true if strIn is in valid e-mail format.
return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{ 1,3 }\.[0-9]{ 1,3 }\.[0-9]{ 1,3 }\.)|(([\w-]+\.)+))([a-zA-Z]{ 2,4 }|[0-9]{ 1,3 })(\]?)$");
}
' Replace invalid characters with empty strings.
Return Regex.Replace(strIn, "[^\w\.@-]", "")
End Function
{
// Replace invalid characters with empty strings.
return Regex.Replace(strIn, @"[^\w\.@-]", "");
}
以下代码CZ使用 Regex.Replace Ҏ来用 dd-mm-yy 的日期Ş式代?mm/dd/yy 的日期Ş式?/p>
Return Regex.Replace(input, _
"\b(?<month>\d{ 1,2 })/(?<day>\d{ 1,2 })/(?<year>\d{ 2,4 })\b", _
"${ day }-${ month }-${ year }")
End Function
{
return Regex.Replace(input,"\\b(?<month>\\d{ 1,2 })/(?<day>\\d{ 1,2 })/(?<year>\\d{ 2,4 })\\b","${ day }-${ month }-${ year }");
}
本示例说明如何在 Regex.Replace 的替换模式中使用命名的反向引用。其中,替换表达?${ day } 插入?(?
以下代码CZ使用 Match.Result 来从 URL 提取协议和端口号。例如,“http://www.penner.cn:8080……将q回“http:8080”?/p>
Dim r As New Regex("^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/", _
RegexOptions.Compiled)
Return r.Match(url).Result("${ proto }${ port }")
End Function
{
Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",
RegexOptions.Compiled);
return r.Match(url).Result("${ proto }${ port }");
}
var
regPathParse
=
/
^([^\\^
\/
]+[\\
\/
]+|\\\\[^\\]+)(.*)$
/
if
(
regPathParse
.
test
(
strFolder
))
{
strRoot
=
RegExp
.$
1
strSub
=
RegExp
.$
2
}
]]>
]]>
或许你想要做的第一件事情就是解析一个某U类型的XML文档Q用dom4j很容易做到。请看下面的C代码Q?/p>
import java.net.URL;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class Foo {
public Document parse(URL url) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
}
}
使用q代器(IteratorsQ?/p>
我们可以通过多种Ҏ来操作XML文档Q这些方法返回java里标准的q代器(IteratorsQ。例如:
public void bar(Document document) throws DocumentException {
Element root = document.getRootElement();
//q代根元素下面的所有子元素
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
//处理代码
}
//q代根元素下面名UCؓ"foo"的子元素
for ( Iterator i = root.elementIterator( "foo" ); i.hasNext(); ) {
Element foo = (Element) i.next();
//处理代码
}
// q代根元素的属性attributesQ元?br />for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
Attribute attribute = (Attribute) i.next();
// do something
}
}
强大的XPathD
在dom4j中XPath可以表示出在XML树状l构中的Document或者Q意的节点QNodeQ(例如QAttributeQElement 或?ProcessingInstruction{)。它可以使在文档中复杂的操作仅通过一行代码就可以完成。例如:
public void bar(Document document) {
List list = document.selectNodes( "http://foo/bar" );
Node node = document.selectSingleNode( "http://foo/bar/author" );
String name = node.valueOf( "@name" );
}
如果你想得到一个XHTML文档中的所有超文本链接Qhypertext linksQ你可以使用下面的代码:
public void findLinks(Document document) throws DocumentException {
List list = document.selectNodes( "http://a/@href" );
for (Iterator iter = list.iterator(); iter.hasNext(); ) {
Attribute attribute = (Attribute) iter.next();
String url = attribute.getValue();
}
}
如果你需要关于XPath语言的Q何帮助,我们强烈推荐q个站点Zvon tutorial他会通过一个一个的例子引导你学习?/p>
快速遍历(Fast LoopingQ?/p>
如果你不得不遍历一个非常大的XML文档Q然后才L行,我们你用快速遍历方法(fast looping methodQ,它可以避免ؓ每一个@环的节点创徏一个P代器对象,如下所C:
public void treeWalk(Document document) {
treeWalk( document.getRootElement() );
}
public void treeWalk(Element element) {
for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
Node node = element.node(i);
if ( node instanceof Element ) {
treeWalk( (Element) node );
}
else {
// do something....
}
}
}
生成一个新的XML文档对象
在dom4j中你可能常常希望用程序生成一个XML文档对象Q下面的E序Zq行了示范:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class Foo {
public Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement( "root" );
Element author1 = root.addElement( "author" )
.addAttribute( "name", "James" )
.addAttribute( "location", "UK" )
.addText( "James Strachan" );
Element author2 = root.addElement( "author" )
.addAttribute( "name", "Bob" )
.addAttribute( "location", "US" )
.addText( "Bob McWhirter" );
return document;
}
}
一个文档对象写入文件中
一个文档对象写入Writer对象的一个简单快速的途径是通过write()Ҏ?/p>
FileWriter out = new FileWriter( "foo.xml" );
document.write( out );
如果你想改变输出文g的排版格式,比如你想要一个漂亮的格式或者是一个紧凑的格式Q或者你想用Writer 对象或者OutputStream 对象来操作,那么你可以用XMLWriter cR?/p>
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Foo {
public void write(Document document) throws IOException {
// 写入文g
XMLWriter writer = new XMLWriter(
new FileWriter( "output.xml" )
);
writer.write( document );
writer.close();
// 以一U优雅的格式写入System.out对象
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter( System.out, format );
writer.write( document );
// 以一U紧凑的格式写入System.out对象
format = OutputFormat.createCompactFormat();
writer = new XMLWriter( System.out, format );
writer.write( document );
}
}
转化为字W串Q或者从字符串{?/p>
如果你有一个文档(DocumentQ对象或者Q何一个节点(NodeQ对象的引用QreferenceQ,象属性(AttributeQ或者元素(ElementQ,你可以通过asXML()Ҏ把它转化Z个默认的XML字符Ԍ
Document document = ...;
String text = document.asXML();
如果你有一些XML内容的字W串表示Q你可以通过DocumentHelper.parseText()Ҏ它重新转化为文档(DocumentQ对象:
String text = "
Document document = DocumentHelper.parseText(text);
通过XSLT样式化文档(DocumentQ?/p>
使用Sun公司提供的JAXP APIXSLT 应用到文档(DocumentQ上是很单的。它允许你用Q何的XSLT引擎Q例如:Xalan或SAXON{)来开发。下面是一个用JAXP创徏一个{化器QtransformerQ,然后它应用到文档(DocumentQ上的例子:
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import org.dom4j.Document;
import org.dom4j.io.DocumentResult;
import org.dom4j.io.DocumentSource;
public class Foo {
public Document styleDocument(
Document document,
String stylesheet
) throws Exception {
// 使用 JAXP 加蝲转化?br />TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(
new StreamSource( stylesheet )
);
// 现在来样式化一个文档(DocumentQ?br />DocumentSource source = new DocumentSource( document );
DocumentResult result = new DocumentResult();
transformer.transform( source, result );
// q回l过样式化的文档QDocumentQ?br />Document transformedDoc = result.getDocument();
return transformedDoc;
}
}
初次试译Q如果有译不妥的地方,希望大家指出来,我们共同q步Q?br />谢谢Q!
[:)]
1QDOM(JAXP Crimson解析?
DOM是用与^台和语言无关的方式表CXML文档的官方W3C标准。DOM是以层次l构l织的节Ҏ信息片断的集合。这个层ơ结构允许开发h员在树中L特定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因而DOM被认为是Z树或Z对象的。DOM以及q义的基于树的处理具有几个优炏V首先,׃树在内存中是持久的,因此可以修改它以便应用程序能Ҏ据和l构作出更改。它q可以在M时候在树中上下DQ而不是像SAX那样是一ơ性的处理。DOM使用h也要单得多?/p>
2QSAX
SAX处理的优炚w常类g媒体的优点。分析能够立卛_始,而不是等待所有的数据被处理。而且Q由于应用程序只是在d数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优炏V事实上Q应用程序甚至不必解析整个文档;它可以在某个条g得到满时停止解析。一般来_SAXq比它的替代者DOM快许多?
选择DOMq是选择SAXQ?对于需要自q写代码来处理XML文档的开发h员来_ 选择DOMq是SAX解析模型是一个非帔R要的设计决策?DOM采用建立树Şl构的方式访问XML文档Q而SAX采用的事件模型?
DOM解析器把XML文档转化Z个包含其内容的树Qƈ可以Ҏq行遍历。用DOM解析模型的优Ҏ~程ҎQ开发h员只需要调用徏树的指oQ然后利用navigation APIs讉K所需的树节点来完成Q务。可以很Ҏ的添加和修改树中的元素。然而由于用DOM解析器的时候需要处理整个XML文档Q所以对性能和内存的要求比较高,其是遇到很大的XML文g的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频J的改变的服务中?
SAX解析器采用了Z事g的模型,它在解析XML文档的时候可以触发一pd的事Ӟ当发现给定的tag的时候,它可以激zM个回调方法,告诉该方法制定的标签已经扑ֈ。SAX对内存的要求通常会比较低Q因为它让开发h员自己来军_所要处理的tag。特别是当开发h员只需要处理文档中所包含的部分数据时QSAXq种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难Q而且很难同时讉K同一个文档中的多处不同数据?
3QJDOM http://www.jdom.org
JDOM的目的是成ؓJava特定文档模型Q它化与XML的交互ƈ且比使用DOM实现更快。由于是W一个Java特定模型QJDOM一直得到大?a class="Channel_KeyLink" >推广和促q。正在考虑通过“Java规范hJSR-102”它最l用?#8220;Java标准扩展”。从2000q初已l开始了JDOM开发?
JDOM与DOM主要有两斚w不同。首先,JDOM仅用具体类而不使用接口。这在某些方面简化了APIQ但是也限制了灵zL。第二,API大量使用了Collectionsc,化了那些已经熟悉q些cȝJava开发者的使用?
JDOM文档声明其目的是“使用20%(或更?的精力解?0%(或更?Java/XML问题”(Ҏ学习曲线假定?0%)。JDOM对于大多数Java/XML应用E序来说当然是有用的Qƈ且大多数开发者发现API比DOMҎ理解得多。JDOMq包括对E序行ؓ的相当广泛检查以防止用户做Q何在XML中无意义的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错?。这也许是比学习DOM或JDOM接口都更有意义的工作?
JDOM自n不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(管它还可以以前构造的DOM表示作ؓ输入)。它包含一些{换器以将JDOM表示输出成SAX2事g、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开?a class="Channel_KeyLink" >源码?/p>
4QDOM4J http://dom4j.sourceforge.net
虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一U智能分支。它合ƈ了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或化文档的基于事件的处理。它q提供了构徏文档表示的选项Q它通过DOM4J API和标准DOM接口hq行讉K功能。从2000下半q开始,它就一直处于开发之中?
为支持所有这些功能,DOM4J使用接口和抽象基本类Ҏ。DOM4J大量使用了API中的Collectionsc,但是在许多情况下Q它q提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是Q虽然DOM4J付出了更复杂的API的代P但是它提供了比JDOM大得多的灉|性?
在添加灵zL、XPath集成和对大文档处理的目标ӞDOM4J的目标与JDOM是一LQ针对Java开发者的易用性和直观操作。它q致力于成ؓ比JDOM更完整的解决ҎQ实现在本质上处理所有Java/XML问题的目标。在完成该目标时Q它比JDOM更少防止不正的应用E序行ؓ?
DOM4J是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码?a class="Channel_KeyLink" >软g。如今你可以看到来多的Java软g都在使用DOM4J来读写XMLQ特别值得一提的是连Sun的JAXM也在用DOM4J?
2.. 比较
1QDOM4J性能最好,qSun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4JQ例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文g。如果不考虑可移植性,那就采用DOM4J.
2QJDOM和DOM在性能试时表C佻I在测?0M文档时内存溢出。在文档情况下q值得考虑使用DOM和JDOM。虽然JDOM的开发者已l说明他们期望在正式发行版前专注性能问题Q但是从性能观点来看Q它实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现q泛应用于多U编E语a。它q是许多其它与XML相关的标准的基础Q因为它正式获得W3C推荐(与基于非标准的Java模型相对)Q所以在某些cd的项目中可能也需要它(如在JavaScript中用DOM)?/p>
3QSAX表现较好Q这要依赖于它特定的解析方式Q事仉动。一个SAX即到来的XML,但ƈ没有载入到内?当然当XML被dӞ会有部分文档暂时隐藏在内存中)?/p>
3. 四种xml操作方式的基本用方?/p>
xml文gQ?/p>
Q?xml version="1.0" encoding="GB2312"?Q?br />QRESULTQ?br /> QVALUEQ?
QNOQA1234Q?NOQ?
QADDRQ四川省XX县XX镇XX路XDXXP/ADDRQ?br /> Q?VALUEQ?br /> QVALUEQ?
QNOQB1234Q?NOQ?
QADDRQ四川省XX市XX乡XX村XXl</ADDRQ?br /> Q?VALUEQ?br />Q?RESULTQ?
1QDOM
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;iQnl.getLength();i++){
System.out.print("车牌L:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
}
}catch(Exception e){
e.printStackTrace();
}
2QSAX
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("q行旉Q? + (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("车牌LQ? + 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);}
}
3Q?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;iQallChildren.size();i++) {
System.out.print("车牌L:" + ((Element)allChildren.get(i)).getChild("NO").getText());
System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
4QDOM4J
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("车牌L:" + foo.elementText("NO"));
System.out.println("车主地址:" + foo.elementText("ADDR"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
转自Q?a >http://blog.dl.net.cn/xd/3/archives/2005/15.html
1.文档对象模型QDOMQ?br />DOM是HTML和XML文档的编E基Q它定义了处理执行文档的途径?
~程者可以用DOM增加文档、定位文档结构、填加修改删除文档元素。W3C的重要目标是把利用DOM提供一个用于多个q_的编E接口。W3C DOM被设计成适合多个q_Q可使用L~程语言实现的方法?br />2.节点接口我的xml文gLogin.xml如下.
<?xml version="1.0" encoding="utf-8" ?>
<Login>
<Character>
<C Text="热血" Value="0"></C>
<C Text="弱气" Value="1"></C>
<C Text="Ȁ? Value="2"></C>
<C Text="冷静" Value="3"></C>
<C Text="冷酷" Value="4"></C>
</Character>
<Weapon>
<W Text="光束? Value="0"></W>
<W Text="光束配刀" Value="1"></W>
</Weapon>
<EconomyProperty>
<P Text="q_? Value="0"></P>
<P Text="重视d" Value="1"></P>
<P Text="重视敏捷" Value="2"></P>
<P Text="重视防M" Value="3"></P>
<P Text="重视命中" Value="4"></P>
</EconomyProperty>
</Login>
现在我需要对q个xml文g的内容进行操?
首先,我们需要加载这个xml文g,js中加载xml文g,是通过XMLDOM来进行的.
// 加蝲xml文档
loadXML = function(xmlFile)
{
var xmlDoc;
if(window.ActiveXObject)
{
xmlDoc = new ActiveXObject(’Microsoft.XMLDOM?;
xmlDoc.async = false;
xmlDoc.load(xmlFile);
}
else if (document.implementation&&document.implementation.createDocument)
{
xmlDoc = document.implementation.createDocument(’? ’? null);
xmlDoc.load(xmlFile);
}
else
{
return null;
}
return xmlDoc;
}
xml文g对象出来? 接下Lp对这个文档进行操作了.
比如?我们现在需要得到节点Login/Weapon/W的第一个节点的属?那么我们可以如下q行.
本文?点击设计 http://www.djasp.Net 攉整理。谢l无聊之{载!
// 首先对xml对象q行判断
checkXMLDocObj = function(xmlFile)
{
var xmlDoc = loadXML(xmlFile);
if(xmlDoc==null)
{
alert(’您的浏览器不支持xml文gd,于是本页面禁止您的操?推荐使用IE5.0以上可以解决此问??;
window.location.href=?Index.aspx?
}
return xmlDoc;
}
★点击设计★ http://www.djasp.Net 全力打造WEB技术站点,Ƣ迎大家讉KQ?/span>
// 然后开始获取需要的Login/Weapon/W的第一个节点的属性?
var xmlDoc = checkXMLDocObj(?EBS/XML/Login.xml?;
var v = xmlDoc.getElementsByTagName(’Login/Weapon/W?[0].childNodes.getAttribute(’Text?
而我在我的程序中的写法是q样子的,当然我在E序中的写法是已l应用到实际中的?一q给出来,以供查看
本文?★点击设计★ http://www.djasp.Net 攉整理。谢l无聊之{载!
initializeSelect = function(oid, xPath)
{
var xmlDoc = checkXMLDocObj(?EBS/XML/Login.xml?;
var n;
var l;
var e = $(oid);
if(e!=null)
{
n = xmlDoc.getElementsByTagName(xPath)[0].childNodes;
l = n.length;
for(var i=0; i<l; i++)
{
var option = document.createElement(’option?;
option.value = n[i].getAttribute(’Value?;
option.innerHTML = n[i].getAttribute(’Text?;
e.appendChild(option);
}
}
}
上面的访问代码中,我们是通过xmlDoc.getElementsByTagName(xPath)来进行的.
q可以通过xmlDoc.documentElement.childNodes(1)..childNodes(0).getAttribute(’Text?q行讉K.
一些常用方?
xmlDoc.documentElement.childNodes(0).nodeName,可以得到q个节点的名U?
xmlDoc.documentElement.childNodes(0).nodeValue,可以得到q个节点的? q个值是来自于这样子的xml格式:<a>b</b>, 于是可以得到bq个?
xmlDoc.documentElement.childNodes(0).hasChild,可以判断是否有子节点
盗版它h|站的内容可耻,您查看的内容来源于★点击设计★www.djasp.Net
Ҏ我的l验,最好是使用getElementsByTagName(xPath)的方法对节点q行讉K,因ؓq样子可以直接通过xPath来定位节?q样子会有更好的性能.
To read and update - create and manipulate - an XML document, you will need an XML parser.
Microsoft's XML parser is a COM component that comes with Internet Explorer 5 and higher. Once you have installed Internet Explorer, the parser is available to scripts.
Microsoft's XML parser supports all the necessary functions to traverse the node tree, access the nodes and their attribute values, insert and delete nodes, and convert the node tree back to XML.
The following table lists the most commonly used node types supported by Microsoft's XML parser:
Node Type | Example |
---|---|
Processing instruction | <?xml version="1.0"?> |
Element | <drink type="beer">Carlsberg</drink> |
Attribute | type="beer" |
Text | Carlsberg |
MSXML Parser 2.5 is the XML parser that is shipped with Windows 2000 and IE 5.5.
MSXML Parser 3.0 is the XML parser that is shipped with IE 6.0 and Windows XP.
The MSXML 3.0 parser features:
To create an instance of Microsoft's XML parser with JavaScript, use the following code:
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM") |
To create an instance of Microsoft's XML parser with VBScript, use the following code:
set xmlDoc=CreateObject("Microsoft.XMLDOM") |
To create an instance of Microsoft's XML parser in an ASP page (using VBScript), use the following code:
set xmlDoc=Server.CreateObject("Microsoft.XMLDOM") |
The following code loads an existing XML document ("note.xml") into Microsoft's XML parser:
<script type="text/javascript"> var xmlDoc=new ActiveXObject("Microsoft.XMLDOM") xmlDoc.async="false" xmlDoc.load("note.xml") ... ... ... </script> |
The first line of the script above creates an instance of the Microsoft XML parser. The third line tells the parser to load an XML document called "note.xml". The second line turns off asynchronized loading, to make sure that the parser will not continue execution of the script before the document is fully loaded.
Plain XML documents are displayed in a tree-like structure in Mozilla (just like IE).
Mozilla also supports parsing of XML data using JavaScript. The parsed data can be displayed as HTML.
To create an instance of the XML parser with JavaScript in Mozilla browsers, use the following code:
var xmlDoc=document.implementation.createDocument("ns","root",null) |
The first parameter, ns, defines the namespace used for the XML document. The second parameter, root, is the XML root element in the XML file. The third parameter, null, is always null because it is not implemented yet.
The following code loads an existing XML document ("note.xml") into Mozillas' XML parser:
<script type="text/javascript"> var xmlDoc=document.implementation.createDocument("","",null); xmlDoc.load("note.xml"); ... ... ... </script> |
The first line of the script above creates an instance of the XML parser. The second line tells the parser to load an XML document called "note.xml".
The following example is a cross browser example that loads an existing XML document ("note.xml") into the XML parser:
<html> <head> <script type="text/javascript"> var xmlDoc function loadXML() { //load xml file // code for IE if (window.ActiveXObject) { xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async=false; xmlDoc.load("note.xml"); getmessage() } // code for Mozilla, etc. else if (document.implementation && document.implementation.createDocument) { xmlDoc= document.implementation.createDocument("","",null); xmlDoc.load("note.xml"); xmlDoc.onload=getmessage } else { alert('Your browser cannot handle this script'); } } function getmessage() { document.getElementById("to").innerHTML= xmlDoc.getElementsByTagName("to")[0].firstChild.nodeValue document.getElementById("from").innerHTML= xmlDoc.getElementsByTagName("from")[0].firstChild.nodeValue document.getElementById("message").innerHTML= xmlDoc.getElementsByTagName("body")[0].firstChild.nodeValue } </script> </head> <body onload="loadXML()" bgcolor="yellow"> <h1>W3Schools Internal Note</h1> <p><b>To:</b> <span id="to"></span><br /> <b>From:</b> <span id="from"></span> <hr /> <b>Message:</b> <span id="message"></span> </p> </body> </html> |
Try it yourself
Internet Explorer supports two ways of loading XML into a document object: the load() method and the loadXML() method. The load() method loads an XML file and the loadXML() method loads a text string that contains XML code.
The following code loads a text string into Microsoft's XML parser:
<script type="text/javascript"> var txt="<note>" txt=txt+"<to>Tove</to><from>Jani</from>" txt=txt+"<heading>Reminder</heading>" txt=txt+"<body>Don't forget me this weekend!</body>" txt=txt+"</note>" var xmlDoc=new ActiveXObject("Microsoft.XMLDOM") xmlDoc.async="false" xmlDoc.loadXML(txt) ... ... ... </script> |
If you have Internet Explorer, you can try it yourself.
Map BuffaloContext.getContext.getSession()
Map BuffaloContext.getContext.getApplication()
Map BuffaloContext.getContext.getCookie()
q日学习了一下AJAXQ照做了几个例子Q感觉比较新奇?/p>
W一个就是自动完成的功能即Autocomplete,具体的例子可以在q里看:http://www.b2c-battery.co.uk
在Search框内输入一个品型P可以看见效果了?/p>
q里用到了一个开源的代码Q?a >AutoAssist Q有兴趣的可以看一下?/p>
以下Z码片断:
index.htm
<script type="text/javascript" src="javascripts/prototype.js"></script>
<script type="text/javascript" src="javascripts/autoassist.js"></script>
<link rel="stylesheet" type="text/css" href="styles/autoassist.css"/>
<div>
<input type="text" name="keyword" id="keyword"/>
<script type="text/javascript">
Event.observe(window, "load", function() {
var aa = new AutoAssist("keyword", function() {
return "forCSV.php?q=" + this.txtBox.value;
});
});
</script>
</div>
不知道ؓ什么不能用keywords做文本框的名字,我试了很久,后来q是用keyword,搞得q要修改原代码?/p>
forCSV.php
<?php
$keyword = $_GET['q'];
$count = 0;
$handle = fopen("products.csv", "r");
while (($data = fgetcsv($handle, 1000)) !== FALSE) {
if (preg_match("/$keyword/i", $data[0])) {
if ($count++ > 10) { break; }
?>
<div onSelect="this.txtBox.value='<?php echo $data[0]; ?>';">
<?php echo $data[0]; ?>
</div>
<?php
}
}
fclose($handle);
if ($count == 0) {
?>
: (, nothing found.
<?php
}
?>
原来的例子中的CSV文g是根据\t来分隔的Q我们也可以用空格或其它的来分隔Q这取决于你的数据结构?/p>
当然你也可以不读文gQ改从数据库里读资料Q就不再废话了?br />
效果囑֦下:
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=635858
本期文章介绍了一位客串的专栏作家Q同时也是我的朋友和同事 Dethe Elza。Dethe 在利?XML q行 Web 应用E序开发方面经验丰富,在此Q我要感谢他Ҏ在介l?DOM ?ECMAScript q行 XML ~程q一斚w的帮助。请密切x本专栏,以了?Dethe 的更多专栏文章?—?David Mertz
DOM 是处?XML ?HTML 的标?API 之一。由于它占用内存大、速度慢,q且冗长Q所以经常受Ch们的指责。尽如此,对于很多应用E序来说Q它仍然是最佳选择Q而且?XML 的另一个主?API —?SAX 无疑要简单得多。DOM 正逐渐出现在一些工具中Q比?Web 览器、SVG 览器、OpenOfficeQ等{?/p>
DOM 很好Q因为它是一U标准,q且被广泛地实现Q同时也内置到其他标准中。作为标准,它对数据的处理与~程语言无关Q这可能是优点,也可能是~点Q但臛_使我们处理数据的方式变得一_。DOM 现在不仅内置?Web 览器,而且也成多基?XML 的规范的一部分。既然它已经成ؓ您的工具的一部分Qƈ且或许您偶尔q会使用它,我想现在应该充分利用它给我们带来的功能了?/p>
在?DOM 一D|间后Q您会看到Ş成了一些模?—?您想要反复做的事情。快h式可以帮助您处理冗长?DOMQƈ创徏自解释的、优雅的代码。这里收集了一些我l常使用的技巧和诀H,q有一?JavaScript CZ?/p>
W一个诀H就是“没有诀H”。DOM 有两U方法将孩子节点d到容器节点(常常是一?Element
Q也可能是一?Document
?DocumentFragment
Q:appendChild(node)
?insertBefore(node, referenceNode)
。看hg~少了什么。假如我惛_一个参考节点后面插入或者由前新增(prependQ一个子节点Q新节点位于列表中的第一位)Q我该怎么做呢Q很多年以来Q我的解x法是~写下列函数Q?/p>
清单 1. 插入和由前新增的错误Ҏ
|
实际上,像清?1 一PinsertBefore()
函数已经被定义ؓQ在参考节点ؓI时q回?appendChild()
。因此,您可以不使用上面的方法,而?清单 2 中的ҎQ或者蟩q它们仅使用内置函数Q?/p>
清单 2. 插入和由前新增的正确Ҏ
|
如果您刚刚接?DOM ~程Q有必要指出的是Q虽然您可以使多个指针指向一个节点,但该节点只能存在?DOM 树中的一个位|。因此,如果您想它插入到树中,没必要先它从树中移除,因ؓ它会自动被移除。当重新节Ҏ序时Q这U机制很方便Q仅需节Ҏ入到C|即可?/p>
Ҏq种机制Q若想交换两个相邻节点(UCؓ node1
?node2
Q的位置Q可以用下列方案之一Q?/p>
|
?/p>
|
![]() ![]() |
![]()
|
Web 面中大量应用了 DOM。若讉K bookmarklets 站点Q参?参考资?/font>Q,您会发现很多有创意的短脚本,它们可以重新~排面Q提取链接,隐藏囄?Flash q告Q等{?/p>
但是Q因?Internet Explorer 没有定义 Node
接口帔RQ可以用于识别节点类型)Q所以您必须保在遗漏接口常量时Q首先ؓ Web ?DOM 脚本中定义接口常量?/p>
清单 3. 保节点被定?/b>
|
清单 4 展示如何提取包含在节点中的所有文本节点:
|
![]() ![]() |
![]()
|
Z常常抱?DOM 太过冗长Qƈ且简单的功能也需要编写大量代码。例如,如果您想创徏一个包含文本ƈ响应点击按钮?<div>
元素Q代码可能类gQ?/p>
清单 5. 创徏 <div> 的“O长之路?/b>
|
若频J按照这U方式创点,键入所有这些代码会使您很快疲惫不堪。必L更好的解x?—?实有这L解决ҎQ下面这个实用工具可以帮助您创徏元素、设|元素属性和风格Qƈd文本子节炏V除?name
参数Q其他参数都是可选的?/p>
清单 6. 函数 elem() 快捷方式
|
使用该快h式,您能够以更加z的Ҏ创徏 清单 5 中的 <div>
元素。注意,attrs
?style
参数是?JavaScript 文本对象而给出的?/p>
清单 7. 创徏 <div> 的简便方?/b>
|
在您惌快速创建大量复杂的 DHTML 对象Ӟq种实用工具可以节省您大量的旉。模式在q里是指,如果您有一U需要频J创建的特定?DOM l构Q则使用实用工具来创建它们。这不但减少了您~写的代码量Q而且也减了重复的剪切、粘贴代码(错误的罪祸首)Qƈ且在阅读代码时思\更加清晰?/p>
![]() ![]() |
![]()
|
DOM 通常很难告诉您,按照文档的顺序,下一个节Ҏ什么。下面有一些实用工P可以帮助您在节点间前后移动:
|
![]() ![]() |
![]()
|
有时候,您可能想要遍?DOMQ在每个节点调用函数或从每个节点q回一个倹{实际上Q由于这些想法非常具有普遍性,所?DOM Level 2 已经包含了一个称?DOM Traversal and Range 的扩展(P?DOM 所有节点定义了对象?APIQ,它用来ؓ DOM 中的所有节点应用函数和?DOM 中选择一个范围。因些函数没有在 Internet Explorer 中定义(臛_目前是这PQ所以您可以使用 nextNode()
来做一些类似的事情?/p>
在这里,我们的想法是创徏一些简单、普通的工具Q然后以不同的方式组装它们来辑ֈ预期的效果。如果您很熟悉函数式~程Q这看v来会很亲切。Beyond JS 库(参阅 参考资?/font>Q将此理念发扬光大?/p>
清单 9. 函数?DOM 实用工具
|
清单 9 包含?4 个基本工兗?code>listNodes() ?listNodesReversed()
函数可以扩展C个可选的长度Q这?Array
?slice()
Ҏ效果cMQ我把这个作为留l您的练习。另一个需要注意的是,map()
?filter()
函数是完全通用的,用于处理M 列表Q不只是节点列表Q。现在,我向您展C它们的几种l合方式?/p>
清单 10. 使用函数式实用工?/b>
|
您可以用这些实用工h提取 ID、修Ҏ式、找到某U节点ƈU除Q等{。一?DOM Traversal and Range API 被广泛实玎ͼ您无需首先构徏列表Q就可以用它们修?DOM 树。它们不但功能强大,q且工作方式也与我在上面所的方式类伹{?/p>
注意Q核?DOM API q不能您将 XML 数据解析?DOMQ或者将 DOM 序列化ؓ XML。这些功能都定义?DOM Level 3 的扩展部分“Load and Save”,但它们还没有被完全实玎ͼ因此现在不要考虑q些。每个^収ͼ览器或其他专业 DOM 应用E序Q有自己?DOM ?XML 间{换的ҎQ但跨^台{换不在本文讨围之内?/p>
DOM q不是十分安全的工具 —?特别是?DOM API 创徏不能作ؓ XML 序列化的树时。绝对不要在同一个程序中混合使用 DOM1 非名U空?API ?DOM2 名称I间感知?APIQ例如,createElement
?createElementNS
Q。如果您使用名称I间Q请量在根元素位置声明所有名U空_q且不要覆盖名称I间前缀Q否则情况会非常混ؕ。一般来_只要按照惯例Q就不会触发使您陷入ȝ的界情c?/p>
如果您一直?Internet Explorer ?innerText
?innerHTML
q行解析Q那么您可以试试使用 elem()
函数。通过构徏cM的一些实用工P您会得到更多便利Qƈ且承了跨^C码的优越性。将q两U方法合用是非常p糕的?/p>
某些 Unicode 字符q没有包含在 XML 中。DOM 的实C您可以添加它们,但后果是无法序列化。这些字W包括大多数的控制字W和 Unicode 代理对(surrogate pairQ中的单个字W。只有您试图在文档中包含二进制数据时才会遇到q种情况Q但q是另一U{向(gotchaQ情c?/p>
![]() ![]() |
![]()
|
我已l介l了 DOM 能做的很多事情,但是 DOMQ和 JavaScriptQ可以做的事情远不止q些。仔l研I、揣摩这些例子,看看是如何用它们来解决可能需要客L脚本、模板或专用 API 的问题?/p>
DOM 有自q局限性和~点Q但同时也拥有众多优点:它内|于很多应用E序中;无论使用 Java 技术、Python ?JavaScriptQ它都以相同方式工作Q它非常便于使用 SAXQ用上q的模板Q它使用h既简z又强大。越来越多的应用E序开始支?DOMQ这包括Z Mozilla 的应用程序、OpenOffice ?Blast Radius ?XMetaL。越来越多的规范需?DOMQƈ对它加以扩展Q例如,SVGQ,因此 DOM 时时d在您的w边。用这U被q泛部v的工Pl对是您的明Z举?/p>
![]() ![]() |
![]()
|
// -- basic features
factory.printing.header = "This is MeadCo"
factory.printing.footer = "Advanced Printing by scriptX"
factory.printing.portrait = false
factory.printing.leftMargin = 1.0
factory.printing.topMargin = 1.0
factory.printing.rightMargin = 1.0
factory.printing.bottomMargin = 1.0
}
</script>
Q?Q?br /><script language="javascript">
function printsetup(){
// 打印面讄
wb.execwb(8,1);
}
function printpreview(){
// 打印面预览
wb.execwb(7,1);
}
function printit()
{
if (confirm(''定打印吗?'')) {
wb.execwb(6,6)
}
}
</script>
</head>
<body>
<OBJECT classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"
height=0 id=wb name=wb width=0></OBJECT>
<input type=button name=button_print value="打印"
onclick="javascript:printit()">
<input type=button name=button_setup value="打印面讄"
onclick="javascript:printsetup();">
<input type=button name=button_show value="打印预览"
onclick="javascript:printpreview();">
<input type=button name=button_fh value="关闭"
onclick="javascript:window.close();">
------------------------------------------------
关于q个lgq有其他的用法,列D如下Q?br />WebBrowser.ExecWB(1,1) 打开
Web.ExecWB(2,1) 关闭现在所有的IEH口Qƈ打开一个新H口
Web.ExecWB(4,1) 保存|页
Web.ExecWB(6,1) 打印
Web.ExecWB(7,1) 打印预览
Web.ExecWB(8,1) 打印面讄
Web.ExecWB(10,1) 查看面属性?br />Web.ExecWB(15,1) 好像是撤销Q有待确认?br />Web.ExecWB(17,1) 全选?br />Web.ExecWB(22,1) h
Web.ExecWB(45,1) 关闭H体无提C?/p>
2、分|半W?br /><HTML>
<HEAD>
<STYLE>
P {page-break-after: always}
</STYLE>
</HEAD>
<BODY>
<%while not rs.eof%>
<P><%=rs(0)%></P>
<%rs.movenext%>
<%wend%>
</BODY>
</HTML>
3、ASP面打印时如何去掉页面底部的路径和顶端的늠~号
Q?Qie的文?〉页面设|?〉讲里面的页眉和脚里面的东襉KLQ打印就不出来了。?br />Q?Q?lt;HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="YC">
<script language="VBscript">
dim hkey_root,hkey_path,hkey_key
hkey_root="HKEY_CURRENT_USER"
hkey_path="\Software\Microsoft\Internet Explorer\PageSetup"
''//讄|页打印的页眉页脚ؓI?br />function pagesetup_null()
on error resume next
Set RegWsh = CreateObject("Wscript.Shell")
hkey_key="\header"
RegWsh.RegWrite hkey_root+hkey_path+hkey_key,""
hkey_key="\footer"
RegWsh.RegWrite hkey_root+hkey_path+hkey_key,""
end function
''//讄|页打印的页眉页脚ؓ默认值?br />function pagesetup_default()
on error resume next
Set RegWsh = CreateObject("Wscript.Shell")
hkey_key="\header"
RegWsh.RegWrite hkey_root+hkey_path+hkey_key,"&w&b늠Q?amp;p/&P"
hkey_key="\footer"
RegWsh.RegWrite hkey_root+hkey_path+hkey_key,"&u&b&d"
end function
</script>
</HEAD>
<BODY>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/><p align=center>
<input type="button" value="清空늠" onclick=pagesetup_null()> <input type="button" value="恢复吗" onclick=pagesetup_default()><br/>
</p>
</BODY>
</HTML>
4、Q动打印
<script LANGUAGE=javascript>
function button1_onclick() {
var odoc=window.iframe1.document;
var r=odoc.body.createTextRange();
var stxt=r.htmlText;
alert(stxt)
var pwin=window.open("","print");
pwin.document.write(stxt);
pwin.print();
}
</script>
4、用FileSystemlg实现WEB应用中的本地特定打印
<script Language=VBscript>
function print_onclick //打印函数
dim label
label=document.printinfo.label.value //获得HTML面的数据?br />set objfs=CreateObject("scripting.FileSystemObject") //创徏FileSystemlg对象的实例?br />set objprinter=objfs.CreateTextFile ("LPT1:",true) //建立与打印机的连接?br />objprinter.Writeline("__________________________________") //输出打印的内容?br />objprinter.Writeline("| |")
objprinter.Writeline("| 您打印的数据是:"&label& " |?
objprinter.Writeline("| |")
objprinter.Writeline("|_________________________________|")
objprinter.close //断开与打印机的连接?br />set objprinter=nothing
set objfs=nothing // 关闭FileSystemlg对象
end function
</script>
服务器端脚本Q?br /><%………?br />set conn=server.CreateObject ("adodb.connection")
conn.Open "DSN=name;UID=XXXX;PWD=XXXX;"
set rs=server.CreateObject("adodb.recordset")
rs.Open(“select ……?,conn,1,1
……?%> //与数据库q行交互
HTML面~码Q?br /><HTML>
………?br /><FORM ID=printinfo NAME="printinfo" >
<INPUT type="button" value="打印>>" id=print name=print > //调用打印函数
<INPUT type=hidden id=text1 name=label value=<%=……?>> //保存服务器端传来的数据?br />………?br /></HTML>
q个是不是跟XML的结构有点相似呢。不同的是,HTML文档的树形主要包含表C元素、标记的节点和表C文本串的节炏V?/p>7.4.2、HTML文档的节?br /> DOM下,HTML文档各个节点被视为各U类型的Node对象。每个Node对象都有自己的属性和ҎQ利用这些属性和Ҏ可以遍历整个文档树。由于HTML文档的复杂性,DOM定义了nodeType来表C点的cd。这里列出Node常用的几U节点类型:
接口 | nodeType帔R | nodeType?/td> | 备注 |
Element | Node.ELEMENT_NODE | 1 | 元素节点 |
Text | Node.TEXT_NODE | 3 | 文本节点 |
Document | Node.DOCUMENT_NODE | 9 | document |
Comment | Node.COMMENT_NODE | 8 | 注释的文?/td> |
DocumentFragment | Node.DOCUMENT_FRAGMENT_NODE | 11 | document片断 |
Attr | Node.ATTRIBUTE_NODE | 2 | 节点属?/td> |
DOM树的根节Ҏ个Document对象Q该对象的documentElement属性引用表C文档根元素的Element对象Q对于HTML文档Q这个就?lt;html>标记Q。Javascript操作HTML文档的时候,documentx向整个文档,<body>?lt;table>{节点类型即为Element。Commentcd的节点则是指文档的注释。具体节点类型的含义Q请参考《Javascript权威指南》,在此不赘q?/p>
Document定义的方法大多数是生产型ҎQ主要用于创建可以插入文档中的各U类型的节点。常用的DocumentҎ有:
Ҏ | 描述 |
createAttribute() | 用指定的名字创徏新的Attr节点?/td> |
createComment() | 用指定的字符串创建新的Comment节点?/td> |
createElement() | 用指定的标记名创建新的Element节点?/td> |
createTextNode() | 用指定的文本创徏新的TextNode节点?/td> |
getElementById() | q回文档中具有指定id属性的Element节点?/td> |
getElementsByTagName() | q回文档中具有指定标记名的所有Element节点?/td> |
对于Element节点Q可以通过调用getAttribute()、setAttribute()、removeAttribute()Ҏ来查询、设|或者删除一个Element节点的性质Q比?lt;table>标记的border属性。下面列出Element常用的属性:
属?/td> | 描述 |
tagName | 元素的标记名Uͼ比如<p>元素为P。HTML文档q回的tabName均ؓ大写?/td> |
Element常用的方法:
Ҏ | 描述 |
getAttribute() | 以字W串形式q回指定属性的倹{?/td> |
getAttributeNode() | 以Attr节点的Ş式返回指定属性的倹{?/td> |
getElementsByTabName() | q回一个Node数组Q包含具有指定标记名的所有Element节点的子孙节点,光序ؓ在文档中出现的顺序?/td> |
hasAttribute() | 如果该元素具有指定名字的属性,则返回true?/td> |
removeAttribute() | 从元素中删除指定的属性?/td> |
removeAttributeNode() | 从元素的属性列表中删除指定的Attr节点?/td> |
setAttribute() | 把指定的属性设|ؓ指定的字W串|如果该属性不存在则添加一个新属性?/td> |
setAttributeNode() | 把指定的Attr节点d到该元素的属性列表中?/td> |
Attr对象代表文档元素的属性,有name、value{属性,可以通过Node接口的attributes属性或者调用Element接口的getAttributeNode()Ҏ来获取。不q,在大多数情况下,使用Element元素属性的最单方法是getAttribute()和setAttribute()两个ҎQ而不是Attr对象?
7.4.3、用DOM操作HTML文档需要指出的是,childNodes[]的值实际上是一个NodeList对象。因此,可以通过遍历childNodes[]数组的每个元素,来枚举一个给定节点的所有子节点Q通过递归Q可以枚举树中的所有节炏V下表列ZNode对象的一些常用属性和ҎQ?/p>
Node对象常用属性:
属?/td> | 描述 |
attributes | 如果该节Ҏ一个ElementQ则以NamedNodeMap形式q回该元素的属性?/td> |
childNodes | 以Node[]的Ş式存攑ֽ前节点的子节炏V如果没有子节点Q则q回I数l?/td> |
firstChild | 以Node的Ş式返回当前节点的W一个子节点。如果没有子节点Q则为null?/td> |
lastChild | 以Node的Ş式返回当前节点的最后一个子节点。如果没有子节点Q则为null?/td> |
nextSibling | 以Node的Ş式返回当前节点的兄弟下一个节炏V如果没有这L节点Q则q回null?/td> |
nodeName | 节点的名字,Element节点则代表Element的标记名U?/td> |
nodeType | 代表节点的类型?/td> |
parentNode | 以Node的Ş式返回当前节点的父节炏V如果没有父节点Q则为null?/td> |
previousSibling | 以Node的Ş式返回紧挨当前节炏V位于它之前的兄弟节炏V如果没有这L节点Q则q回null?/td> |
Node对象常用ҎQ?/p>
Ҏ | 描述 |
appendChild() | 通过把一个节点增加到当前节点的childNodes[]l,l文档树增加节点?/td> |
cloneNode() | 复制当前节点Q或者复制当前节点以及它的所有子孙节炏V?/td> |
hasChildNodes() | 如果当前节点拥有子节点,则将q回true?/td> |
insertBefore() | l文档树插入一个节点,位置在当前节点的指定子节点之前。如果该节点已经存在Q则删除之再插入到它的位|?/td> |
removeChild() | 从文档树中删除ƈq回指定的子节点?/td> |
replaceChild() | 从文档树中删除ƈq回指定的子节点Q用另一个节Ҏ换它?/td> |
接下来,让我们用上q的DOM应用~程接口Q来试着操作HTML文档?/p>