XPath API的使用
XPath運算式比繁瑣的文件物件模型(DOM)代碼要容易編寫得多。如果需要從XML文檔中提取資訊,最快捷、最簡單的辦法就是在Java程式中嵌入XPath運算式。在Java版本中推出了javax.xml.xpath包,這是一個用於XPath文檔查詢的獨立於XML物件模型的庫。
XPath API的常用類及介面如下:
XPath 介面
XPathFactory類
XPathVariableResolver介面和XPathFunctionResolver介面
XPathExpression介面
XPathVariableResolver介面和XPathFunctionResolver介面主要用於在程式中定義和使用XPath的擴充函數,一般不常使用。
XPathFactory類
XPathFactory執行個體可用於建立XPath對象。該類只有一個受保護的空構造方法,常用的方法主要有以下幾種:
abstract void setXPathFunctionResolver(XPathFunctionResolver resolver):建立預設函數解析器。
static XPathFactory newInstance( ):擷取使用預設物件模型(DOM)的新XPathFactory 執行個體。
abstract void setXPathVariableResolver(XPathVariableResolver resolver):建立預設變數解析器。
abstract boolean isObjectModelSupported(String objectModel):此XPathFactory是否支援指定的物件模型。
在實際應用中經常會使用的newInstance( )靜態方法來獲得一個該類的執行個體,
XPath 介面
提供了對XPath計算環境和運算式的訪問。XPath對象不是安全執行緒的,也不能重複載入。也就是說應用程式負責確保在任意給定時間內不能有多個線程使用一個XPath對象。
常用方法有以下幾種 :
void reset():將此XPath重設為其初始配置。
XPathExpression compile(String expression):編譯XPath運算式。
void setXPathFunctionResolver(XPathFunctionResolver resolver):建立函數解析器。
void setNamespaceContext(NamespaceContext nsContext):建立名稱空間上下文。
void setXPathVariableResolver(XPathVariableResolver resolver):建立變數解析器。
XPathExpression介面
XPathExpression介面提供了對編譯後的XPath運算式的訪問。如果運算式包含變數,則其值將通過XPathVariableResolver()方法找到,如果變數解析器未定義或解析器返回null,將會拋出異常。如果運算式包含函數引用,則函數將通過XPathFunctionResolver()方法找到。如果函數解析器未定義或解析器為函數返回null,將會拋出異常。
該介面最長用的方法是evaluate()方法,如下:
String evaluate(InputSource source):計算指定InputSource編譯後的XPath運算式並將結果以字串形式返回。
String evaluate(Object item):計算指定編譯後的XPath運算式並以字串形式返回。
Object evaluate(Object item, QName returnType): 計算指定的XPath運算式並返回指定類型的結果。
Object evaluate(InputSource source, QName returnType):計算指定InputSource編譯後的XPath運算式並返回指定類型的結果。
XPath API的使用樣本
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;
public class TestXpath2{
public static void main(String[ ] args)throws Exception{
DocumentBuilderFactory domFactory=
DocumentBuilderFactory.newInstance( );
DocumentBuilder builder=domFactory.newDocumentBuilder( );
Document doc=builder.parse("cdcatalog.xml");
//擷取一個XPathFactory執行個體
XPathFactory factory = XPathFactory.newInstance( );
XPath xpath = factory.newXPath( );
//使用XPath函數
XPathExpression expr= xpath.compile("sum(//cd/price)");
String result =expr.evaluate(doc);
System.out.println(result);
}
}
在XPath運算式中使用XPath函數庫的sum()函數。
XPath的資料類型
XPath 1.0隻有四種基本的資料類型:
number(數值型)
node-set(節點型)
boolean(布爾型)
string(字串型)
XPath的資料類型在Java中的對應關係如下表:
在計算XPath運算式時,使用XPathExpression介面的evaluate()方法。該方法可以有兩個參數。其中第二個參數就是用於指定需要的傳回型別,該參數的值都是在XPathConstants中已經命名的靜態欄位。如下:
XPathConstants.BOOLEAN
XPathConstants.NODESET
XPathConstants.NUMBER
XPathConstants.STRING
XPathConstants.STRING
XPathConstants.NODE並沒有匹配的XPath類型,它主要適用於當XPath運算式的結果有且只有一個節點。如果XPath運算式返回了多個節點,卻指定類型為XPathConstants.NODE,則evaluate()方法將按照文檔順序返回第一個節點。如果XPath運算式的結果為一個空集,卻指定類型為XPathConstants.NODE,則evaluate( )方法將返回null。