读书人

DOM4J 应用简介

发布时间: 2012-07-18 12:05:40 作者: rapoo

DOM4J 使用简介

转:http://blog.csdn.net/icecloud/article/details/7795

?

DOM4J是dom4j.org出品的一个开源XML解析包,它的网站中这样定义:

interface java.lang.Cloneable

  • interface org.dom4j.Node ??
  • interface org.dom4j.Attribute
  • interface org.dom4j.Branch ???
  • interface org.dom4j.Document
  • interface org.dom4j.Element
  • interface org.dom4j.CharacterData
  • interface org.dom4j.CDATA
  • interface org.dom4j.Comment
  • interface org.dom4j.Text
  • interface org.dom4j.DocumentType
  • interface org.dom4j.Entity
  • interface org.dom4j.ProcessingInstruction

    ??? // 从文件读取XML,输入文件名,返回XML文档

    ??? public Document read(String fileName) throws MalformedURLException, DocumentException {

    ?????? SAXReader reader = new SAXReader();

    ?????? Document document = reader.read(new File(fileName));

    ?????? return document;

     ? public Element getRootElement(Document doc){

    ?????? return doc.getRootElement();

    ??? // 枚举所有子节点

    ??? for ( Iterator i = root.elementIterator(); i.hasNext(); ) {

    ?????? Element element = (Element) i.next();

    ?????? // do something

    ??? }

    ??? // 枚举名称为foo的节点

    ??? for ( Iterator i = root.elementIterator(foo); i.hasNext();) {

    ?????? Element foo = (Element) i.next();

    ?????? // do something

    ??? }

    ??? // 枚举属性

    ??? for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {

    ?????? Attribute attribute = (Attribute) i.next();

    ?????? // do something

    ??? public void treeWalk() {

    ?????? treeWalk(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....

    ?????????? }

    ?????? }

     ???? ? public class MyVisitor extends VisitorSupport {

    ?????? ??? public void visit(Element element){

    ?????????? ??? System.out.println(element.getName());

    ?????? ??? }

    ??? ??? ?? public void visit(Attribute attr){

    ?????????? ??? System.out.println(attr.getName());

    ?????? ??? }

    ??????? }
    ?
    ??????? 调用:? root.accept(new MyVisitor())

    ?

    ?? public void bar(Document document) {

    ?????? ?List list = document.selectNodes( //foo/bar );

    ?????? ?Node node = document.selectSingleNode(//foo/bar/author);

    ?????? ?String name = node.valueOf( @name );

    ??? ?}

    ?

    ??? 例如,如果你想查找XHTML文档中所有的超链接,下面的代码可以实现:

    ?

    ??? public void findLinks(Document document) throws DocumentException {

    ?????? ?List list = document.selectNodes( //a/@href );

    ?????? ?for (Iterator iter = list.iterator(); iter.hasNext(); ) {

    ?????????? ?Attribute attribute = (Attribute) iter.next();

    ?????????? ?String url = attribute.getValue();

    ?????? ?}

    ??? ?}

    ?

    5. 字符串与XML的转换

    有时候经常要用到字符串转换为XML或反之,

      Document document = ...;

    ??? String text = document.asXML();

    // 字符串转XML

    ??? String text = <person> <name>James</name> </person>;

    6 用XSLT转换XML

    ?

    ?? public Document styleDocument(

    ?????? Document document,

    ?????? String stylesheet

    ??? ) throws Exception {

    ??? // load the transformer using JAXP

    ??? TransformerFactory factory = TransformerFactory.newInstance();

    ??? Transformer transformer = factory.newTransformer(

    ?????? new StreamSource( stylesheet )

    ??? );

    ??? // now lets style the given document

    ??? DocumentSource source = new DocumentSource( document );

    ??? DocumentResult result = new DocumentResult();

    ??? transformer.transform( source, result );

    ??? // return the transformed document

    ??? Document transformedDoc = result.getDocument();

    ??? return transformedDoc;

    ?

    ??? 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;

    ??? FileWriter out = new FileWriter( foo.xml );

    ??? document.write(out);

    ?

    ? 如果你想改变输出的格式,比如美化输出或缩减格式,可以用XMLWriter类
    ??? public void write(Document document) throws IOException {

    ?????? // 指定文件

    ?????? XMLWriter writer = new XMLWriter(

    ??? ?????? new FileWriter( output.xml )

    ?????? );

    ?????? writer.write( document );

    ?????? writer.close();

    ?????? // 美化格式

    ?????? OutputFormat format = OutputFormat.createPrettyPrint();

    ?????? writer = new XMLWriter( System.out, format );

    ?????? writer.write( document );

    ?????? // 缩减格式

    ?????? format = OutputFormat.createCompactFormat();

    ?????? writer = new XMLWriter( System.out, format );

    ?????? writer.write( document );

    ??? }

    ?

    如何,DOM4J够简单吧,当然,还有一些复杂的应用没有提到,如ElementHandler等。如果你动心了,那就一起来用DOM4J.

    DOM4J官方网站:(我老连不上)

    http://www.dom4j.org

    DOM4J下载(SourceForge),最新版本为1.4

    http://sourceforge.net/projects/dom4j

    参考资料:

    DOM4J文档

    Java 中的 XML:文档模型,第一部分:性能

    http://www-900.ibm.com/developerWorks/cn/xml/x-injava/index.shtml

    Java 中的 XML:Java 文档模型的用法

    http://www-900.ibm.com/developerWorks/cn/xml/x-injava2/index.shtml

    Java XML API 漫谈 by robbin

    http://www.hibernate.org.cn:8000/137.html

  • 读书人网 >Web前端

    热点推荐