Jdom开发指南(XML读写操作及XPath语法分析)

来源:互联网 发布:ghost系统还原软件 编辑:程序博客网 时间:2024/05/16 02:33

JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作;使用JDOM可以方便的实现XML文档的读写操作。

下载地址:http://www.jdom.org/

开发包:jdom.jar,xerces.jar,jaxen-1.1-beta-4.jar

  XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML文档中对元素和属性进行遍历,XPath使用路径表达式来选择XML文档的节点或者节点集合。

 

Jdom基础知识:

Jdom常用数据类型介绍:Attribute(属性),CDATA,Coment(注释),DocType(文档类型),Document(文档),Element(元素),EntityRef,Namespace(命名空间),ProscessingInstruction(处理指令), Text(文本内容)

 

XPath语法分析:

(1)表达式说明:

nodename   Selects all childnodes of the node[选择所有目前节的子节]

/    Selectsfrom the root node[从根节进行选择]

//   Selects nodes in thedocument from the current node that match the selection no matterwhere they are [选择文档中相吻合的节而不管其在文档的何处]

.    Selectsthe current node[选择当前节]

..    Selectsthe parent of the current node[当前节的父节]

@    Selectsattributes[选择属性]

(2)通配符说明:

*    Matches any element node[相吻合的所有元素节]

@*   Matches any attributenode[相吻合的所有属性节]

node()  Matches any node of anykind[吻合任何类型的节]

(3)表达式常用函数说明:

string concat (string, string, string*) 联接两个字符串

boolean starts-with (string, string) 判断某字符串是否以另一字符串开头

boolean contains (string, string) 判断某字符串是否包含另一字符串

string substring (string, number, number) 取子字符串

number string-length (string)  测字符串长度

number sum (node-set)  求和

number floor (number)  求小于此数的最大整数值

number ceiling (number)  求大于此数最小整数值

(4)Xpath常用函数说明:

abstract  java.util.ListselectNodes(java.lang.Object context)

         Evaluates the wrapped XPath expression and returns the list ofselected items.

static java.util.List selectNodes(java.lang.Object context,java.lang.String path)

         Evaluates an XPath expression and returns the list of selecteditems.

abstract  java.lang.ObjectselectSingleNode(java.lang.Object context)

         Evaluates the wrapped XPath expression and returns the first entryin the

         list of selected nodes (or atomics).

static java.lang.Object selectSingleNode(java.lang.Objectcontext, java.lang.String path)

         Evaluates the wrapped XPath expression and returns the first entryin the

         list of selected nodes (or atomics).

 

实例制作(xml文档操作):

1.firstpage.xml

<?xml version="1.0"encoding="GBK"?>

<data>

  <parent>

   <childid="1">child1</child>

   <childid="2">child2</child>

   <child id="3">

      <desc>

        <name>zhangsan</name>

        <sex>sex</sex>

        <age>10</age>

      </desc>

   </child>

  </parent>

</data>

2.JdomExample.java

import java.io.InputStreamReader;

import java.util.List;

import org.jdom.Document;

import org.jdom.Element;

import org.jdom.input.SAXBuilder;

import org.jdom.xpath.XPath;

 

public class JdomExample {

      public static void main(String args[]) {

             SAXBuilder builder = new SAXBuilder(

                           "org.apache.xerces.parsers.SAXParser", false);

             InputStreamReader config = null;

             // newJdomTest().getClass().getResourceAsStream("firstpage.xml");

             try {

                    config = new java.io.InputStreamReader(newjava.io.FileInputStream(

                                  "firstpage.xml"), "GBK");

                    Document doc = builder.build(config);

                    Element root = doc.getRootElement();

                    echo(root);

                    // Xpath test

                    System.out.println("*********xpath test*****");

                    // org/jaxen/JaxenException

                    // lack:jaxen包

                    // parent下级节点;/表示根(绝对路径)

                    List list = XPath.selectNodes(root, "/data/parent/*");

                    System.out.println(list.size());// 3

                    // parent下所有节点 //选择文档中相吻合的节而不管其在文档的何处

                    list = XPath.selectNodes(root, "/data/parent//*");

                    System.out.println(list.size());// 7

                    list = XPath.selectNodes(root, "/child");

                    System.out.println(list.size());// 0

                    list = XPath.selectNodes(root, "//child");

                    System.out.println(list.size());// 3

                    list = XPath.selectNodes(root, "/data");

                    System.out.println(list.size());// 1

                    list = XPath.selectNodes(root, "//data");

                    System.out.println(list.size());// 1

                    list = XPath.selectNodes(root, "//parent");

                    System.out.println(list.size());// 1

                    list = XPath.selectNodes(root, "/parent");

                    System.out.println(list.size());// 0

                    list = XPath.selectNodes(root, "//child/desc/z");

                    System.out.println(list.size());// 0

                    list = XPath.selectNodes(root, "//child/desc/sex");

                    System.out.println(list.size());// 1

                    list = XPath.selectNodes(root, "//child/desc/sex");

                    System.out.println(list.size());// 1

                    //节点的附加元素,比如属性,函数等都要用方括号扩起来,属性前面要加上@号

                    // 属性验证(包含id属性的元素)

                    list = XPath.selectNodes(root, "//child[@id]");

                    System.out.println(list.size());// 3

                    // id=3

                    list = XPath.selectNodes(root, "//child[@id=3]");

                    System.out.println(list.size());// 1

                    // id>0

                    list = XPath.selectNodes(root,"//child[@id>0]");

                    System.out.println(list.size());// 3

                    // 前2个child元素

                    list = XPath.selectNodes(root,"//child[position()<3]");

                    System.out.println(list.size());// 2

                    // 倒数第二个child元素

                    list = XPath.selectNodes(root, "//child[last()-1]");

                    System.out.println(list.size());// 1

                    // 最后一个child元素desc子节点下所有元素

                    list = XPath.selectNodes(root, "//child[last()]/desc/*");

                    System.out.println(list.size());// 3

                    // 最后一个child元素所对应的所有下级子节点

                    list = XPath.selectNodes(root, "//child[last()]/*");

                    System.out.println(list.size());// 1

                    // 选择文档中所有name和sex元素

                    list = XPath.selectNodes(root, "//name|//sex");

                    System.out.println(list.size());// 2

                    Element currentElement = (Element)(XPath.selectSingleNode(root,

                                  "//child/desc"));

                    if (currentElement != null) {

                           System.out.println(currentElement.getName());// desc

                    }

                    // 父节点

                    list = XPath.selectNodes(currentElement.getParentElement(),"/*");

                    // 1:data

                    System.out.println(list.size() + ":"

                                 + ((Element) list.get(0)).getName());

                    // @@@@整个文档的所有节点,注意//不受元素的约束

                    list = XPath.selectNodes(currentElement.getParentElement(),"//*");

                    System.out.println(list.size());// 9

                    // 表示当前元素的下级元素,不包括第3级

                    list = XPath.selectNodes(currentElement.getParentElement(),"*");

                    // 1:desc

                    System.out.println(list.size() + ":"

                                  + ((Element) list.get(0)).getName());

                    // 可以接当前元素的下级元素,但不可以是孙以下元素

                    list = XPath.selectNodes(currentElement.getParentElement(),"sex");

                    System.out.println(list.size());// 0

                    list = XPath.selectNodes(currentElement.getParentElement(),"desc");

                    System.out.println(list.size());// 1

                    //Xpath函数处理

                    list = XPath.selectNodes(root, "//age[text()='10']");

                    //1:age找出文本为10的age元素

                    System.out.println(list.size() + ":"

                                 + ((Element) list.get(0)).getName());

             } catch (Exception e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

             }

      }

 

      private static void echo(Element element) {

             // This returns a List of all the child elements nested directly(one

             // level deep)

             // within this element, as Element objects.

             List childrenList = element.getChildren();

             if (childrenList.size() <= 0) {

                    // 没有子元素

                    String eleValue = element.getText();

                    System.out.println("element value:" + eleValue);

             } else {

                    // 取得所有子元素的配置信息

                    for (int i = 0; i < childrenList.size(); i++) {

                           Element ele = (Element) childrenList.get(i);

                           echo(ele);

                    }

             }

 

      }

 

      private int getchildrenNum(List ls) {

             if (ls == null) {

                    return -1;

             }

             return ls.size();

      }

}