仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1808|回复: 20
打印 上一主题 下一主题

[学习教程] JAVA教程之在JAVA中利用文档对象模子DOM履历小结

[复制链接]
灵魂腐蚀 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:42:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
再说第三点:我并没有提到服务器也要整合,然后是IDE,一个好的IDE能够200%提高开发的速度,就说图形方面:你是经过简单托拽和点击就能实现功能好那。dom|对象文档对象模子(DOM)是一个文档尺度,关于完整的文档和庞大的使用程序,DOM供应了大批天真性。DOM尺度是尺度的。它很健壮且完全,而且有很多完成。这是很多年夜型安装的决意要素--出格是对产物使用程序,以免在API产生改动时举行大批的改写。
以上是我在选择处置XML数据时之以是没有选择JDOM大概dom4j等别的面向对象的尺度的缘故原由,不外也因为DOM从一入手下手就是一种与言语有关的模子,并且它更趋势用于像C或Perl这类言语,没有益用Java的面向对象的功能,以是在利用的过程当中也碰到了很多的贫苦,明天这里做一个小结。别的,我今朝利用XML次要是作为数据传输的一致格局,并一致用户界面展现的接口,使用的面并非很广,以是利用到的DOM的内容实在未几。
在筹办利用它的时分,是做了充分的筹办的,也有碰到坚苦的筹办,以是一入手下手就有了一个复杂的工具类来封装DOM对象利用时需要的大众办法,实践证实如许做是很明智的,一个复杂的创立Document对象的操纵,如果每次都必要写上5行以上代码,而且还要处置那些烦人的Exception,其实是会冲击人人的主动性,以是在最后,做了一个XMLTool类,专门封装了以下的大众办法:
1、Document对象创立(包含空的Document对象创立,以一个给定Node节点作为根节点创立。
2、将一个标准的XML字符串转换成一个Document对象。
3、从物理硬盘读取一个XML文件并前往一个Document对象。
4、将一个Node对象转换成字符串。

个中每一个办法都截获相干的DOM操纵所抛出的非常,转换成一个RuntimeException抛出,这些非常在实践利用过程当中,一样平常情况下实在都不会抛出,出格是象天生一个Document对象时的ParserConfigurationException、转换Node节点成字符串时要天生一个Transformer对象时的TransformerConfigurationException等等,没有需要在它们身上花工夫精神。并且真就出了相干的非常的话,实在基本没有举措处置,如许的情况一般是体系情况设置有成绩(好比需要的DOM完成剖析器等包没有到场情况),以是包装该非常时只是很扼要的猎取其Message抛出。
代码以下:
/**
*初始化一个空Document对象前往。
*@returnaDocument
*/
publicstaticDocumentnewXMLDocument(){
try{
returnnewDocumentBuilder().newDocument();
}catch(ParserConfigurationExceptione){
thrownewRuntimeException(e.getMessage());
}
}

/**
*初始化一个DocumentBuilder
*@returnaDocumentBuilder
*@throwsParserConfigurationException
*/
publicstaticDocumentBuildernewDocumentBuilder()
throwsParserConfigurationException{
returnnewDocumentBuilderFactory().newDocumentBuilder();
}

/**
*初始化一个DocumentBuilderFactory
*@returnaDocumentBuilderFactory
*/
publicstaticDocumentBuilderFactorynewDocumentBuilderFactory(){
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
returndbf;
}
/**
*将传进的一个XMLString转换成一个org.w3c.dom.Document对象前往。
*@paramxmlString一个切合XML标准的字符串表达。
*@returnaDocument
*/
publicstaticDocumentparseXMLDocument(StringxmlString){
if(xmlString==null){
thrownewIllegalArgumentException();
}
try{
returnnewDocumentBuilder().parse(
newInputSource(newStringReader(xmlString)));
}catch(Exceptione){
thrownewRuntimeException(e.getMessage());
}
}

/**
*给定一个输出流,剖析为一个org.w3c.dom.Document对象前往。
*@paraminput
*@returnaorg.w3c.dom.Document
*/
publicstaticDocumentparseXMLDocument(InputStreaminput){
if(input==null){
thrownewIllegalArgumentException("参数为null!");
}
try{
returnnewDocumentBuilder().parse(input);
}catch(Exceptione){
thrownewRuntimeException(e.getMessage());
}
}
/**
*给定一个文件名,猎取该文件并剖析为一个org.w3c.dom.Document对象前往。
*@paramfileName待剖析文件的文件名
*@returnaorg.w3c.dom.Document
*/
publicstaticDocumentloadXMLDocumentFromFile(StringfileName){
if(fileName==null){
thrownewIllegalArgumentException("未指定文件名及其物理路径!");
}
try{
returnnewDocumentBuilder().parse(newFile(fileName));
}catch(SAXExceptione){
thrownewIllegalArgumentException(
"方针文件("+fileName+")不克不及被准确剖析为XML!
"+e.getMessage());
}catch(IOExceptione){
thrownewIllegalArgumentException(
"不克不及猎取方针文件("+fileName+")!
"+e.getMessage());
}catch(ParserConfigurationExceptione){
thrownewRuntimeException(e.getMessage());
}
}
/**
*给定一个节点,将该节点到场新机关的Document中。
*@paramnodeaDocumentnode
*@returnanewDocument
*/
publicstaticDocumentnewXMLDocument(Nodenode){
Documentdoc=newXMLDocument();
doc.appendChild(doc.importNode(node,true));
returndoc;
}

/**
*将传进的一个DOMNode对象输入成字符串。假如失利则前往一个空字符串""。
*@paramnodeDOMNode对象。
*@returnaXMLStringfromnode
*/
publicstaticStringtoString(Nodenode){
if(node==null){
thrownewIllegalArgumentException();
}
Transformertransformer=newTransformer();
if(transformer!=null){
try{
StringWritersw=newStringWriter();
transformer.transform(
newDOMSource(node),
newStreamResult(sw));
returnsw.toString();
}catch(TransformerExceptionte){
thrownewRuntimeException(te.getMessage());

}
}
returnerrXMLString("不克不及天生XML信息!");
}
/**
*将传进的一个DOMNode对象输入成字符串。假如失利则前往一个空字符串""。
*@paramnodeDOMNode对象。
*@returnaXMLStringfromnode
*/
publicstaticStringtoString(Nodenode){
if(node==null){
thrownewIllegalArgumentException();
}
Transformertransformer=newTransformer();
if(transformer!=null){
try{
StringWritersw=newStringWriter();
transformer.transform(
newDOMSource(node),
newStreamResult(sw));
returnsw.toString();
}catch(TransformerExceptionte){
thrownewRuntimeException(te.getMessage());

}
}
returnerrXMLString("不克不及天生XML信息!");
}
/**
*猎取一个Transformer对象,因为利用时都做不异的初始化,以是提掏出来作为大众办法。
*@returnaTransformerencodinggb2312
*/
publicstaticTransformernewTransformer(){
try{
Transformertransformer=
TransformerFactory.newInstance().newTransformer();
Propertiesproperties=transformer.getOutputProperties();
properties.setProperty(OutputKeys.ENCODING,"gb2312");
properties.setProperty(OutputKeys.METHOD,"xml");
properties.setProperty(OutputKeys.VERSION,"1.0");
properties.setProperty(OutputKeys.INDENT,"no");
transformer.setOutputProperties(properties);
returntransformer;
}catch(TransformerConfigurationExceptiontce){
thrownewRuntimeException(tce.getMessage());
}
}
/**
*前往一段XML表述的毛病信息。提醒信息的TITLE为:体系毛病。之以是利用字符串拼装,次要是如许做一样平常
*不会有非常呈现。
*@paramerrMsg提醒毛病信息
*@returnaXMLStringshowerrmsg
*/
publicstaticStringerrXMLString(StringerrMsg){
StringBuffermsg=newStringBuffer(100);
msg.append("<?xmlversion="1.0"encoding="gb2312"?>");
msg.append("<errNodetitle="体系毛病"errMsg=""+errMsg+""/>");
returnmsg.toString();
}
/**
*前往一段XML表述的毛病信息。提醒信息的TITLE为:体系毛病
*@paramerrMsg提醒毛病信息
*@paramerrClass抛出该毛病的类,用于提取毛病来历信息。
*@returnaXMLStringshowerrmsg
*/
publicstaticStringerrXMLString(StringerrMsg,ClasserrClass){
StringBuffermsg=newStringBuffer(100);
msg.append("<?xmlversion="1.0"encoding="gb2312"?>");
msg.append(
"<errNodetitle="体系毛病"errMsg=""
+errMsg
+""errSource=""
+errClass.getName()
+""/>");
returnmsg.toString();
}
/**
*前往一段XML表述的毛病信息。
*@paramtitle提醒的title
*@paramerrMsg提醒毛病信息
*@paramerrClass抛出该毛病的类,用于提取毛病来历信息。
*@returnaXMLStringshowerrmsg
*/
publicstaticStringerrXMLString(
Stringtitle,
StringerrMsg,
ClasserrClass){
StringBuffermsg=newStringBuffer(100);
msg.append("<?xmlversion="1.0"encoding="gb2312"?>");
msg.append(
"<errNodetitle=""
+title
+""errMsg=""
+errMsg
+""errSource=""
+errClass.getName()
+""/>");
returnmsg.toString();
}

以上都是DOM的基础使用,以是就纷歧一具体申明了。
在实践利用过程当中,有几种情况利用很频仍,可是DOM的接口的计划却使该操纵很贫苦,以是分离增加了响应的处置办法。
个中最贫苦的要数猎取一个节点的Text子节点文本信息了,以下的XML节点:
<element>
text
</element>
在具有element节点对象时,要猎取个中的文本信息"text",起首要猎取element节点的子节点列表,要判别其是不是存在子节点,假如存在,那末遍历其子节点找到一个TextNode节点,经由过程getNodeValue()办法来猎取该文本信息,因为这里element节点没有信息时没有子节点,以是必需判别element节点是不是存在子节点才干往会见真正包括了文本信息的TextNode节点,那末假如要处置的数据都是以这类情势给出的,就会增添大批的开辟代码同时闪开发事情单调有趣,因而这里利用了一个默许的商定完成,就是,给出了一个大众办法,该办法取给定Node下的间接子节点的Text节点文本信息,假如不存在Text节点则前往null,这个商定固然使该办法的利用有所限定,也大概招致毛病利用该办法,可是,按实践利用的情况来看,如许的商定和利用体例是没有成绩的,由于实践用到的都是下面举的例子的情况,代码:
/**
*这个办法猎取给定Node下的Text节点文本信息,假如不存在Text节点则前往null。
*注重:是间接子节点,相差2层或2层以上不会被思索。
*@paramnodeaNode一个Node。
*@returnaString假如给定节点存在Text子节点,则前往第一个会见到的Text子节点文本信息,假如不存在则前往null。
*/
publicstaticStringgetNodeValue(Nodenode){
if(node==null){
returnnull;
}

Texttext=getTextNode(node);

if(text!=null){
returntext.getNodeValue();
}

returnnull;
}

/**
*这个办法猎取给定Node下的Text节点,假如不存在Text节点则前往null。
*注重:是间接子节点,相差2层或2层以上不会被思索。
*@paramnodeaNode一个Node。
*@returnaText假如给定节点存在Text子节点,则前往第一个会见到的Text子节点,假如不存在则前往null。
*/
publicstaticTextgetTextNode(Nodenode){
if(node==null){
returnnull;
}
if(node.hasChildNodes()){
NodeListlist=node.getChildNodes();
for(inti=0;i<list.getLength();i++){
if(list.item(i).getNodeType()==Node.TEXT_NODE){
return(Text)list.item(i);
}
}
}
returnnull;
}

下面代码将猎取给定Node节点的间接Text子节点分隔包装。

另外一个很常常碰着的情况是,我但愿间接定位到方针节点,猎取该节点对象,而不必要经由过程一层一层的节点遍向来找到方针节点,DOM2接口中最少供应了以下的体例来定位节点:
1、关于Document对象:
1)getDocumentElement()DD猎取根节点对象,实践很少利用的,由于根节点基础也就只是根节点罢了,实践的数据节点都是根节点下的间接子节点入手下手的。
2)getElementById(StringelementId)DD这个办法原本应当是一个最好的定位办法,可是在实践利用过程当中没有被我利用,其次要缘故原由就是,这里的"ID"分歧于一个节点的属性"ID",这在org.w3c.dom.Document的API申明中是明白指出,而我找了很多的材料也没有看到有关的利用体例,以是只好保持了。
3)getElementsByTagName(Stringtagname)DD这个办法实际上是没有举措的选择,只好用它了,不外实践倒也很适用,固然该办法前往的是一个NodeList,可是实践利用时,将节点的tagName计划成特别字符串,那末就能够间接猎取了,而实践利用时,实在也差未几,良多时分会间接拿数据库中的字段名来作为tagName,以便利得猎取该字段得值,在一个复杂得商定下,利用了以下办法:
/**
*这个办法检索参数element下一切TagName为:tagName的节点,并前往节点列表的第一个节点。
*假如不存在该tagName的节点,则前往null。
*@paramelement待搜刮节点
*@paramtagName待搜刮标署名
*@returnaElement取得以tagName为标署名的节点列表的第一个节点。
*/
publicstaticElementgetFirstElementByName(
Elementelement,
StringtagName){
return(Element)getFirstElement(element.getElementsByTagName(tagName));
}
/**
*从给定节点列表中猎取第一个节点前往,假如节点汇合为null/空,则前往null。
*@paramnodeListaNodeList
*@returnaNode
*/
privatestaticNodegetFirstElement(NodeListnodeList){
if(nodeList==null||nodeList.getLength()==0){
returnnull;
}
returnnodeList.item(0);
}
这个商定看似限定很年夜,实在实践利用时基础都是如许的,只需猎取第一个给定tagName的Element节点就能够了的。
4)getElementsByTagNameNS(StringnamespaceURI,StringlocalName)DD这个办法基础没有利用,由于还没有碰着必要利用定名空间的情况。
2、关于Element对象DDDDElement对象和Document对象相同,少了getDocumentElement()办法,不外和Document一样也都是次要利用getElementsByTagName()办法。
3、别的的节点对象基础没有间接定位的会见办法

另有一种,是因为DOM2的限定招致的,DOM2标准中,不克不及将一个DocumentdocA的节点间接到场到另外一个DocumentdocB对象的节点的子节点列表中,要这么做必需起首将docA的节点经由过程docB的importNode办法转换后在增加到方针节点的子节点列表中,以是也有一个办法来一致处置:
/**
*这个办法将参数appendedDoc的根节点及其以下节点附加到doc的跟节点上面。
*作为doc的跟节点的作后一个子节点。
*相称于:doc.appendDoc(appendedDoc);
*@paramdocaDocument
*@paramappendedDocaDocument
*/
publicstaticvoidappendXMLDocument(Documentdoc,DocumentappendedDoc){
if(appendedDoc!=null){
doc.getFirstChild().appendChild(
doc.importNode(appendedDoc.getFirstChild(),true));
}
}
/**
*这个办法将参数appendedDoc的根节点及其以下节点附加到node节点上面。
*作为node节点的作后一个子节点。
*相称于:node.appendDoc(appendedNode);
*@paramnode待增加的节点将被增加到该节点的最初。
*@paramappendedNodeaNode这个节点将被增加作为node节点的最初一个子节点。
*/
publicstaticvoidappendXMLDocument(Nodenode,NodeappendedNode){
if(appendedNode==null){
return;
}
if(appendedNodeinstanceofDocument){
appendedNode=((Document)appendedNode).getDocumentElement();
}
node.appendChild(
node.getOwnerDocument().importNode(appendedNode,true));
}

基础上就这些经常使用的了,别的另有一些琐屑的办法,不外都不经常使用到,就不作先容了。别的要说的是,假如哪位晓得下面说到的getElementById()办法的详细可行的便利用法,也请指教下。


学习JAVA的目的更多的是培养自身的工作能力,我觉得工作能力的一个核心就是:独立思考能力,因为只有独立思考后,才会有自己的见解
莫相离 该用户已被删除
沙发
发表于 2015-1-21 13:02:57 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
灵魂腐蚀 该用户已被删除
板凳
 楼主| 发表于 2015-1-24 15:35:52 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
若相依 该用户已被删除
地板
发表于 2015-2-1 21:11:23 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
谁可相欹 该用户已被删除
5#
发表于 2015-2-4 22:38:14 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
分手快乐 该用户已被删除
6#
发表于 2015-2-10 22:14:43 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
海妖 该用户已被删除
7#
发表于 2015-2-28 13:39:59 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
深爱那片海 该用户已被删除
8#
发表于 2015-3-9 23:27:34 | 只看该作者
是一种使用者不需花费很多时间学习的语言
飘飘悠悠 该用户已被删除
9#
发表于 2015-3-17 03:05:17 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
第二个灵魂 该用户已被删除
10#
发表于 2015-3-21 01:06:51 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
再见西城 该用户已被删除
11#
发表于 2015-3-28 22:49:10 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
变相怪杰 该用户已被删除
12#
发表于 2015-4-1 17:18:15 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
简单生活 该用户已被删除
13#
发表于 2015-4-7 19:23:51 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
不帅 该用户已被删除
14#
发表于 2015-4-14 10:05:05 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
admin 该用户已被删除
15#
发表于 2015-4-19 14:30:52 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
活着的死人 该用户已被删除
16#
发表于 2015-4-26 16:10:27 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
透明 该用户已被删除
17#
发表于 2015-5-1 02:12:27 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
再现理想 该用户已被删除
18#
发表于 2015-5-5 13:11:23 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
山那边是海 该用户已被删除
19#
发表于 2015-5-6 14:09:40 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
精灵巫婆 该用户已被删除
20#
发表于 2015-6-11 15:21:45 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 21:54

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表