1,xml文件的读取
读取xml文件的方式有两种,一种是面向模型的DOM方式,一种是面向事件的SAX方式
DOM方式原理:一次性的将xml文档加入内存,在内存中形成一颗dom树,然后通过语言对树的节点进行操作。
显然这种操作查找元素快,但是一次性的将文件加载进来,要是小还行,文件大的时候会增大内存负担的,因此这种方式最好是解析小的xml文件的时候用
SAX方式原理:边读边解析,按照从做往右从上往下的顺序解析。
由于解析过的节点不能再次利用,要想使用还得再次解析,所以效率相对来说比较低,但只有事件触发了才会去读取文件,所以内存不会很大。
两种方式,各有优缺点,谁也不能代替谁,举个简单的例子吧,就像生活中的自行车无法取代汽车,汽车无法取代自行车一样,两者各有优势。根据具体需求选择。
DOM实现:
- importjava.io.File;@H_301_79@
- importjavax.xml.parsers.DocumentBuilder;@H_301_79@
- importjavax.xml.parsers.DocumentBuilderFactory;@H_301_79@
- importorg.w3c.dom.Document;@H_301_79@
- importorg.w3c.dom.Node;@H_301_79@
- @H_301_79@
- @H_301_79@
- publicclassdom{@H_301_79@
- publicstaticvoidmain(Stringargs[])throwsException{@H_301_79@
- //创建文件解析工厂@H_301_79@
- DocumentBuilderFactorydfactory=DocumentBuilderFactory.newInstance();@H_301_79@
- @H_301_79@
- @H_301_79@
- //使用工厂创建文件解析类@H_301_79@
- DocumentBuilderbuilder=dfactory.newDocumentBuilder();@H_301_79@
- @H_301_79@
- @H_301_79@
- //开始解析文件,将文件加载进内存,形成dom树@H_301_79@
- Documentdocument=builder.parse(newFile("test.xml"));@H_301_79@
- @H_301_79@
- @H_301_79@
- //获取根节点并打印出来@H_301_79@
- Noderootn=document.getFirstChild();@H_301_79@
- System.out.println(rootn.getNodeName());@H_301_79@
- }@H_301_79@
- }@H_301_79@
SAX实现:
- importjava.io.File;@H_301_79@
- importorg.dom4j.Document;@H_301_79@
- importorg.dom4j.Element;@H_301_79@
- importorg.dom4j.io.SAXReader;@H_301_79@
- @H_301_79@
- @H_301_79@
- publicclasssax{@H_301_79@
- publicstaticvoidmain(Stringargs[])throwsException{@H_301_79@
- //创建解析对象@H_301_79@
- SAXReaderreader=newSAXReader();@H_301_79@
- @H_301_79@
- @H_301_79@
- //读取xml文件@H_301_79@
- Documentdocument=reader.read(newFile("test.xml"));@H_301_79@
- @H_301_79@
- @H_301_79@
- //获取根节点@H_301_79@
- Elementroote=document.getRootElement();@H_301_79@
- //获取根节点下面的子节点@H_301_79@
- Stringchilde=roote.elementText("学生");@H_301_79@
- System.out.println(roote.getName());@H_301_79@
- System.out.println(childe);@H_301_79@
- }@H_301_79@
- }@H_301_79@
注意:需要导入dom4j的jar包,如果不使用工具需要配置classpath环境变量才能使用jar。
如果有多个学生标签,会返回第一个标签的内容。
SAX实现+xpath
- packagecom.bjpowernode.xml;@H_301_79@
- @H_301_79@
- @H_301_79@
- importjava.io.File;@H_301_79@
- @H_301_79@
- @H_301_79@
- importorg.dom4j.Document;@H_301_79@
- importorg.dom4j.Element;@H_301_79@
- importorg.dom4j.io.SAXReader;@H_301_79@
- @H_301_79@
- publicclassSAXandxpath{@H_301_79@
- publicstaticvoidmain(String[]args)throwsException{@H_301_79@
- @H_301_79@
- SAXReaderreader=newSAXReader();@H_301_79@
- Documentdocument=reader.read(newFile("test.xml"));@H_301_79@
- Stringxpath="/test/学生";@H_301_79@
- Elementelement=(Element)document.selectSingleNode(xpath);@H_301_79@
- System.out.println(element.getText());@H_301_79@
- }@H_301_79@
- }@H_301_79@
使用xpath达到快速定位的效果。使用时需要导入相应的jar包
2,xml文件的写入
Dom方式:使用dom方式写入xml文件(基于dom4j)
- importjava.io.FileWriter;@H_301_79@
- importorg.dom4j.Document;@H_301_79@
- importorg.dom4j.DocumentHelper;@H_301_79@
- importorg.dom4j.Element;@H_301_79@
- importorg.dom4j.io.OutputFormat;@H_301_79@
- importorg.dom4j.io.XMLWriter;@H_301_79@
- @H_301_79@
- @H_301_79@
- publicclassdomwrite{@H_301_79@
- publicstaticvoidmain(Stringargs[])throwsException{@H_301_79@
- //创建一个文档对象@H_301_79@
- Documentdocument=DocumentHelper.createDocument();@H_301_79@
- @H_301_79@
- @H_301_79@
- //构造dom树@H_301_79@
- Elementroote=document.addElement("学生信息");@H_301_79@
- Elementchile=roote.addElement("学生");@H_301_79@
- chile.addAttribute("id","1");@H_301_79@
- chile.setText("shuangzhe");@H_301_79@
- Elementchile1=roote.addElement("学生");@H_301_79@
- chile1.addAttribute("id","2");@H_301_79@
- chile1.setText("litongxue");@H_301_79@
- @H_301_79@
- @H_301_79@
- @H_301_79@
- //设置字符编码方式@H_301_79@
- OutputFormatformat=OutputFormat.createPrettyPrint();@H_301_79@
- format.setEncoding("GB18030");@H_301_79@
- @H_301_79@
- @H_301_79@
- //开始写@H_301_79@
- XMLWriterxmlWriter=newXMLWriter(newFileWriter("student.xml"),format);@H_301_79@
- xmlWriter.write(document);@H_301_79@
- xmlWriter.close();@H_301_79@
- }@H_301_79@
- }@H_301_79@