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文件内容的结构?有想法的给点建议。
让我们继续前行
----------------------------------------------------------------------
努力不一定成功,但不努力肯定不会成功。
共勉。
相关文章推荐
- Java 阶段面试 知识点合集 - 我们到底能走多远系列(15)
- 学习java中的几个Map-我们到底能走多远系列(27)
- java IO 流的学习(我们到底能走多远系列1)
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- 定时任务管理中心(dubbo+spring)-我们到底能走多远系列48
- 多线程_传送带-我们到底能走多远系列(6)
- Tomcat加载类机制 - 我们到底能走多远系列(14)
- 当你想在web应用中使用线程的时候-我们到底能走多远系列(24)
- 服务调用方案(Spring Http Invoker) - 我们到底能走多远系列(40)
- 我们到底能走多远系列(13)
- 当我们说线程安全时,到底在说什么——Java进阶系列(二)
- InternalInputBuffer处理HTTP请求行-Tomcat源码-我们到底能走多远系列(11)
- 定时任务管理中心(dubbo+spring)-我们到底能走多远系列47
- 文件下载-excel导出-我们到底能走多远系列(22)
- springmvc对同名参数处理-我们到底能走多远系列(44)
- 当我们说线程安全时,到底在说什么——Java进阶系列(二)
- 遍历文件夹内的文件(我们到底能走多远系列2)
- How Tomcat Works 学习-我们到底能走多远系列(8)
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- 图片上传+预览+剪切解决方案-我们到底能走多远系列(20)