|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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的目的更多的是培养自身的工作能力,我觉得工作能力的一个核心就是:独立思考能力,因为只有独立思考后,才会有自己的见解 |
|