您的位置:首页 > 编程语言 > Java开发

java XML解析-我们到底能走多远系列(12)

2012-10-29 23:30 645 查看

我们到底能走多远系列(12)

扯淡:距离我们到底能走多远系列的阶段性目标15篇,已经很近了,100篇的最终目标还很远。

   最近,接到个面试通知,做了份笔试,大部分都是基础题目,有java的,sql的。看来下一次换工作的征途又要开始啦,哈哈。

  只记得有个简单的小题目了,把ABC,变成CBA。很简单的基础题,只是我实在记不起那个笔试题里的其他题目了。哎...

实现:

packagecode.stu.string;

publicclassInversion{

publicstaticvoidmain(String[]args){
System.out.println(inversion("abcdefghijk"));

}

publicstaticStringinversion(Stringstr){

char[]chars=str.toCharArray();//String转换成char[]
intlen=chars.length;
intmin=0;
intmax=len-1;
charvalue;
while(min<len/2||max>len/2){//对调进行到中间位置就跳出循环
//三步互换
value=chars[min];
chars[min]=chars[max];
chars[max]=value;
min++;
max--;
}

returnString.valueOf(chars);//char[]转换成String
}
}


主题:

  我们对xml解析都不陌生,很多地方有涉及到它,比如:Spring,tomcat,ibatis,都有用xml。

  介绍下java解析xml的两种方式:DOM和SAX

   DOM的方式是吧整个xml文件读到内存中,进行解析。

   SAX的方式则是[b]一步步读取每一个节点和内容而触发事件进行解析。[/b]

两种代码调用的方式如下:其实他们的源码也值得有尽力的朋友解读啊。

  Dom:


/**
*
*@parampath配置文件路径
*@paramnodeName节点名
*@paramnodeValue修改成什么样value
*@return
*@throwsException
*/
publicintchangeConfig1(Stringpath,StringnodeName,StringnodeValue)throwsException{
Fileconfig=newFile(path);
//解析器工厂类
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
//解析器
DocumentBuilderdb=dbf.newDocumentBuilder();
//文档树模型Document
Documentdocument=db.parse(config);
//A.通过xml文档解析
NodeListnodeList=document.getElementsByTagName(nodeName);
//B.将需要解析的xml文档转化为输入流,再进行解析
//InputStreamis=newFileInputStream(config);
//DocumentnodeList=db.parse(is);

for(inti=0;i<nodeList.getLength();i++){
//ElementextendsNode
Elementnode=(Element)nodeList.item(i);
System.out.println(node.getElementsByTagName("b").item(0).getFirstChild().getNodeValue());
node.getElementsByTagName(nodeName).item(0).getFirstChild().setTextContent(nodeValue);
System.out.println(node.getElementsByTagName("c").item(0).getFirstChild().getNodeValue());
}
//是改动生效,网上很多代码都没有提到这步操作,我不明白他们是怎么完成修改xml的value值的。
//可以理解成内存中的数据已经被改了,还没有映射到文件中
TransformerFactorytfFac=TransformerFactory.newInstance();
Transformertf=tfFac.newTransformer();
DOMSourcesource=newDOMSource(document);
tf.transform(source,newStreamResult(config));//修改内容映射到文件
return0;
}



  SAX:

packageweb.method.file.sax;

importjava.io.FileReader;
importjava.util.ArrayList;
importjava.util.List;

importorg.xml.sax.Attributes;
importorg.xml.sax.InputSource;
importorg.xml.sax.SAXException;
importorg.xml.sax.XMLReader;
importorg.xml.sax.helpers.DefaultHandler;
importorg.xml.sax.helpers.XMLReaderFactory;

importweb.method.file.model.People;
//继承DefaultHandler
publicclassConfigHandlerextendsDefaultHandler{

privatefinalList<People>peoples=newArrayList<People>();

privatePeoplep;
privateStringcurrentValue=null;
privateStringpreTag=null;

@Override
//开始Element
publicvoidstartElement(Stringuri,StringlocalName,Stringname,
Attributesattributes)throwsSAXException{
if("people".equals(name)){
p=newPeople();
}
preTag=name;
}

@Override
//结束Element
publicvoidendElement(Stringuri,StringlocalName,Stringname)
throwsSAXException{
if("people".equals(name)&&p!=null){
peoples.add(p);
}
preTag=null;
}

@Override
//值
publicvoidcharacters(char[]ch,intstart,intlength)
throwsSAXException{
currentValue=newString(ch,start,length);

if(preTag!=null&&p!=null){
if(preTag.equals("name")){
p.setName(currentValue);
}elseif(preTag.equals("from")){
p.setFrom(currentValue);
}

}
}

//取值
publicList<People>getPeoples(){
returnpeoples;
}

publicstaticvoidmain(String[]args)throwsException{
ConfigHandlerhandler=newConfigHandler();

//创建一个XML解析器(通过SAX方式读取解析XML)
XMLReaderreader=XMLReaderFactory.createXMLReader();//设置XML解析器的处理文档内容相关事件的处理器
reader.setContentHandler(handler);
//解析books.xml文档
reader.parse(newInputSource(newFileReader("D:\\我的文档\\company.xml")));

for(inti=0;i<handler.getPeoples().size();i++){
System.out.println(handler.getPeoples().get(i).getName());
}
}
}


xml:

<?xmlversion="1.0"encoding="UTF-8"standalone="no"?>
<companycount="3"xmlns="http://test.org/company">
<people>
<name>dc</name>
<age>96</age>
<from>losangles</from>
<discription>havebiggestmindintheworld</discription>
</people>
<people>
<name>jiannanchun</name>
<age>96</age>
<from>lasvages</from>
<discription>agooddefender</discription>
</people>
</company>


总结:这只是对解析xml的开始,先学会怎么用吧。

为什么要继续对这方面学习呢?因为现在自己空闲的时候,在编个工程,想用xml来存数据。在这方面学习过的朋友给点建议哦。

现在遇到的问题是:怎样设计一个多线程读取xml文件内容的结构?有想法的给点建议。

让我们继续前行

----------------------------------------------------------------------

努力不一定成功,但不努力肯定不会成功。
共勉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: