XML(Extensible Markup Language)即可扩展标记语言,这个东东的详细情况可以参见百度百科,我主要说下它的两大作用1.存储数据;2.跨平台的数据传输(也就是应用于不同的平台之上,有桥梁的作用,我是这么理解的,呵呵)。ok,现在说说对xml文件的解析,java本事对xml有一套规范和解析方式,但是不是很好用,目前比较常用的其他解析类库有jdom和dom4j,相比之下据说dom4j相对强大一点,那我们就用dom4j吧。
首先需要说明的是这个技术的学习方略是按照官方的文档进行。并没有参见其他的文章,虽然文档时英文的,虽然我的英语很菜,但还是能看懂的。相当于官方说明的翻译工作吧。
1.下载dom4j的压缩包,个人比较喜欢去官方找。英文的网站找google大神就搞定了。
2.在eclipse下新建java工程,放入dom4j要用到的jar包,这里要用到两个dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar个,后者是在用到xpath的时候用,负责会报错!
3.打开下载的安装包下的docs目录下index.html文件,一大堆英文出来了,点左侧的那个quick start快速开始,翻译工作开始:
Parsing XML解析xml文件,第一种是官方文档上的,二三是我自己加的:
/** * 解析XML文件,这里有多重读取方式,这里是URL * @param url * @return * @throws DocumentException */ public Document parse(URL url) throws DocumentException{ SAXReader reader = new SAXReader(); return reader.read(url); } /** * 采用用路径构造文件的方法 * @param path * @return * @throws DocumentException */ public Document parse(String path) throws DocumentException{ SAXReader reader = new SAXReader(); return reader.read(new File(path)); } /** * 用文件流对象构造xml文档 * @param in * @return * @throws DocumentException */ public Document parse(InputStream in) throws DocumentException{ SAXReader reader = new SAXReader(); return reader.read(in); }
Using Iterators用迭代打方式解析xml文件的内容
/** * 遍历xml文件 * @param document */ public void iteratorFind(Document document){ Element root = document.getRootElement(); //从根节点遍历 for(Iterator i = root.elementIterator();i.hasNext();){ Element element = (Element) i.next(); System.out.println(element.attributeValue("name")); System.out.println(element.getText()); } //从某一节点开始遍历 for(Iterator i = root.elementIterator("foo");i.hasNext();){ Element element = (Element) i.next(); //做一些事情 } //遍历属性 for ( Iterator i = root.attributeIterator(); i.hasNext(); ) { Attribute attribute = (Attribute) i.next(); // do something } }
Powerful Navigation with XPath强大的xpath导航
/** * X-path的查找方式 * @param document */ public void xpathFind(Document document){ List<Element> list = document.selectNodes("/root/author"); for(int i=0;i<list.size();i++){ Element element = list.get(i); String name = element.attributeValue("name"); System.out.println(name); } System.out.println(list.size()); Node node = document.selectSingleNode("/root/author"); //采用@+属性名的方式获得属内容 String name = node.valueOf("@name"); String text = node.getText(); System.out.println(name + text); }
Fast Looping 快速循环,实际上和iterator差不多
public void treeWalk(Document document) { treeWalk( document.getRootElement() ); } public void treeWalk(Element element) { for ( int i = 0, size = element.nodeCount(); i < size; i++ ) { Node node = element.node(i); if ( node instanceof Element ) { treeWalk( (Element) node ); } else { // do something.... } } }
Creating a new XML document 创建一个新的xml文档,建议按我的教程先执行这步操作,后面的解析内容都是应用这部分demo产生的xml文件进行的。
/** * 创建一个XML文件 * @return */ public Document createDocument(){ Document document = DocumentHelper.createDocument(); Element root = document.addElement("root"); Element author1 = root.addElement("author") .addAttribute("name", "James") .addAttribute("location", "UK") .addText( "James Strachan" ); Element author2 = root.addElement( "author" ) .addAttribute( "name", "Bob" ) .addAttribute( "location", "US" ) .addText( "Bob McWhirter" ); return document; }
Write xml document to file 将xml文件写入到文件系统,即存储到磁盘,但是这个写的文件格式不是很好看
/** * 写xml文档到磁盘文件 * @param document * @throws IOException */ public void writeFile(Document document) throws IOException{ XMLWriter writer = new XMLWriter(new FileWriter("output.xml")); writer.write(document); writer.close(); }
这里提供一种比较好看的输出方式
/** * 格式话写xml文件 * @param document * @throws IOException */ public void prettyWrite(Document document) throws IOException{ OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format); writer.write(document); writer.close(); }
Converting to and from Strings 将字符串转换成xml文件
/** * 将文本的xml文件转换成xml文档 * @return * @throws DocumentException */ public Document convertFromStr() throws DocumentException{ String xmlStr = "<books><book author='李连杰'>1基金</book><book author='周星驰'>演员的自我修养</book></books>"; Document document = DocumentHelper.parseText(xmlStr); return document; }
也可以将xml文档转换成string
/** * 将xml文档转换成String * @return * @throws DocumentException */ public String covertFromXML() throws DocumentException{ Document document = convertFromStr(); return document.asXML(); }
最后写下dom4j对visitor的支持,先写一visitor类,继承自VisitorSupport
public class MyVisitor extends VisitorSupport { @Override public void visit(Attribute attribute) { System.out.println("-----"+attribute.getValue()); } @Override public void visit(Element element) { System.out.println("------"+element.getText()); } }
调用的时的方法,直接使用文档或者节点.appept(new 自己写的visitor类);
public void testVisitor() throws DocumentException{ Document document = xml.convertFromStr(); //document.accept(new MyVisitor()); document.selectSingleNode("/books/book").accept(new MyVisitor()); }
注意:文章中生成的文件放在了工程的目录下,要了解java中路径的问题请查看我的另一篇博客java路径的获取方式。
最后将我的demo一起随附件上传。