| Oracle® Fusion Middleware Oracle WebLogic Server XMLアプリケーションの開発 12c (12.2.1) E69996-01 |
|
![]() 前 |
![]() 次 |
この章では、WebLogic XPath APIの使用方法について説明します。
この章の内容は以下のとおりです。
WebLogic XPath APIには、DOM、XMLInputStream、またはXMLOutputStreamとして表現されるドキュメントに対してXPathのマッチングを実行するために必要となる、すべてのクラスが入っています。このAPIは、指定したパターンに適合するXMLドキュメント内のXML要素のサブセットを識別する場合に使用します。
WebLogic XPath APIのAPIリファレンスの追加情報は、Oracle WebLogic Server Java APIリファレンスのweblogic.xml.xpathに関する項を参照してください。
この節では、DOMとして表現されるXMLドキュメントに対してXPathのマッチングを実行するために、WebLogic XPath APIのDOMXPathクラスを使用する方法について説明します。最初に例を示し、次にその例で使われている主な手順について説明します。
この節の最後に示すサンプルJavaプログラムでは、次のXMLドキュメントをマッチングに使用しています。
<?xml version='1.0' encoding='us-ascii'?>
<!-- "Purchaseorder". -->
<purchaseorder
department="Sales"
date="01-11-2001"
raisedby="Pikachu"
>
<item
ID="101">
<title>Laptop</title>
<quantity>5</quantity>
<make>Dell</make>
</item>
<item
ID="102">
<title>Desktop</title>
<quantity>15</quantity>
<make>Dell</make>
</item>
<item
ID="103">
<title>Office Software</title>
<quantity>10</quantity>
<make>Microsoft</make>
</item>
</purchaseorder>
Javaコード例は次のとおりです。
package examples.xml.xpath;
import java.io.IOException;
import java.util.Iterator;
import java.util.Set;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
import weblogic.xml.xpath.DOMXPath;
import weblogic.xml.xpath.XPathException;
/**
* This class provides a simple example of how to use the DOMXPath
* API.
*
* @author Copyright (c) 2002 by BEA Systems, Inc. All Rights Reserved.
*/
public abstract class DOMXPathExample {
public static void main(String[] ignored)
throws XPathException, ParserConfigurationException,
SAXException, IOException
{
// create a dom representation of the document
String file = "purchaseorder.xml";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true); // doesn't matter for this example
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(file);
// create some instances of DOMXPath to evaluate against the
// document.
DOMXPath totalItems = // count number of items
new DOMXPath("count(purchaseorder/item)");
DOMXPath atLeast10 = // titles of items with quantity >= 10
new DOMXPath("purchaseorder/item[quantity >= 10]/title");
// evaluate them against the document
double count = totalItems.evaluateAsNumber(doc);
Set nodeset = atLeast10.evaluateAsNodeset(doc);
// output results
System.out.println(file+" contains "+count+" total items.");
System.out.println("The following items have quantity >= 10:");
if (nodeset != null) {
Iterator i = nodeset.iterator();
while(i.hasNext()) {
Node node = (Node)i.next();
System.out.println(" "+node.getNodeName()+
": "+node.getFirstChild().getNodeValue());
}
}
// note that at this point we are free to continue using evaluate
// atLeast10 and totalItems against other documents
}
}
次の手順では、DOMXPathクラスを使用して、DOMで表現されるXMLドキュメントに対してXPathのマッチングを実行するための主な手順について説明します。
次のサンプル・コードように、XMLドキュメントからorg.w3c.dom.Documentオブジェクトを作成します。
String file = "purchaseorder.xml"; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(file);
DOMに対して評価するXPath式を表すDOMXPathオブジェクトを作成します。
次の例では、発注書内の項目数をカウントするXPath式を示します。
DOMXPath totalItems =
new DOMXPath("count(purchaseorder/item)");
次の例では、数量が10以上の項目を持つタイトルを返すXPath式を示します。
DOMXPath atLeast10 =
new DOMXPath("purchaseorder/item[quantity >= 10]/title");
DOMXPath.evaluateAsXXX()メソッドの1つを使用して、XPath式を評価します。XXXは、Boolean、Nodeset、Number、Stringといった戻り値のデータ型を表します。
次の例では、evaluateAsNumber()メソッドを使用してtotalItems XPath式を評価する方法を示します。
double count = totalItems.evaluateAsNumber(doc); System.out.println(file+" contains "+count+" total items.");
次の例では、evaluateAsNodeset()メソッドを使用して、標準的な方法で反復処理できるorg.w3c.dom.NodesのSetを返す方法を示します。
Set nodeset = atLeast10.evaluateAsNodeset(doc);
System.out.println("The following items have quantity >= 10:");
if (nodeset != null) {
Iterator i = nodeset.iterator();
while(i.hasNext()) {
Node node = (Node)i.next();
System.out.println(" "+node.getNodeName()+
": "+node.getFirstChild().getNodeValue());
}
}
WebLogic XPath APIのAPIリファレンスの追加情報は、Oracle WebLogic Server Java APIリファレンスのweblogic.xml.xpathに関する項を参照してください。
次の例では、WebLogic XPath APIのStreamXPathクラスを使用して、XMLInputStreamに対してXPathマッチングを実行する方法を示します。最初に例を示し、次にその例で使われている主な手順について説明します。例ではXMLInputStreamに対してマッチングを実行する方法のみを示しますが、同様のコードを使用すればXMLOutputStreamに対してマッチングを実行できます。
この節の最後に示すサンプルJavaプログラムでは、次のXMLドキュメントをマッチングに使用しています。
<?xml version='1.0' encoding='us-ascii'?>
<!-- "Stock Quotes". -->
<stock_quotes>
<stock_quote symbol='BEAS'>
<when>
<date>01/27/2001</date>
<time>3:40PM</time>
</when>
<price type="ask" value="65.1875"/>
<price type="open" value="64.00"/>
<price type="dayhigh" value="66.6875"/>
<price type="daylow" value="64.75"/>
<change>+2.1875</change>
<volume>7050200</volume>
</stock_quote>
<stock_quote symbol='MSFT'>
<when>
<date>01/27/2001</date>
<time>3:40PM</time>
</when>
<price type="ask" value="55.6875"/>
<price type="open" value="50.25"/>
<price type="dayhigh" value="56"/>
<price type="daylow" value="52.9375"/>
<change>+5.25</change>
<volume>64282200</volume>
</stock_quote>
</stock_quotes>
サンプルのJavaコードは次のとおりです。
package examples.xml.xpath;
import java.io.File;
import weblogic.xml.stream.Attribute;
import weblogic.xml.stream.StartElement;
import weblogic.xml.stream.XMLEvent;
import weblogic.xml.stream.XMLInputStream;
import weblogic.xml.stream.XMLInputStreamFactory;
import weblogic.xml.stream.XMLStreamException;
import weblogic.xml.xpath.StreamXPath;
import weblogic.xml.xpath.XPathException;
import weblogic.xml.xpath.XPathStreamFactory;
import weblogic.xml.xpath.XPathStreamObserver;
/**
* This class provides a simple example of how to use the StreamXPath
* API.
*
* @author Copyright (c) 2002 by BEA Systems, Inc. All Rights Reserved.
*/
public abstract class StreamXPathExample {
public static void main(String[] ignored)
throws XPathException, XMLStreamException
{
// Create instances of StreamXPath for two xpaths we want to match
// against this tream.
StreamXPath symbols =
new StreamXPath("stock_quotes/stock_quote");
StreamXPath openingPrices =
new StreamXPath("stock_quotes/stock_quote/price[@type='open']");
// Create an XPathStreamFactory.
XPathStreamFactory factory = new XPathStreamFactory();
// Create and install two XPathStreamObservers. In this case, we
// just use to anonymous classes to print a message when a
// callback is received. Note that a given observer can observe
// more than one xpath, and a given xpath can be observed by
// mutliple observers.
factory.install(symbols, new XPathStreamObserver () {
public void observe(XMLEvent event) {
System.out.println("Matched a quote: "+event);
}
public void observeAttribute(StartElement e, Attribute a) {} //ignore
public void observeNamespace(StartElement e, Attribute a) {} //ignore
});
// Note that we get matches for both a start and an end elements,
// even in the case of <price/> which is an empty element - this
// is the behavior of the underlying streaming parser.
factory.install(openingPrices, new XPathStreamObserver () {
public void observe(XMLEvent event) {
System.out.println("Matched an opening price: "+event);
}
public void observeAttribute(StartElement e, Attribute a) {} //ignore
public void observeNamespace(StartElement e, Attribute a) {} //ignore
});
// get an XMLInputStream on the document
String file = "stocks.xml";
XMLInputStream sourceStream = XMLInputStreamFactory.newInstance().
newInputStream(new File(file));
// use the factory to create an XMLInputStream that will do xpath
// matching against the source stream
XMLInputStream matchingStream = factory.createStream(sourceStream);
// now iterate through the stream
System.out.println("Matching against xml stream from "+file);
while(matchingStream.hasNext()) {
// we don't do anything with the events in our example - the
// XPathStreamObserver instances that we installed in the
// factory will get callbacks for appropriate events
XMLEvent event = matchingStream.next();
}
}
}
次の手順では、StreamXPathクラスを使用して、XMLInputStreamとして表現されるXMLドキュメントに対してXPathのマッチングを実行するための主な手順を説明します。
XMLInputStreamに対して評価するXPath式を表すStreamXPathオブジェクトを作成します。
StreamXPath symbols =
new StreamXPath("stock_quotes/stock_quote");
次の例では、開始値を使用して株価を検索するXPath式を示します。
StreamXPath openingPrices = new StreamXPath("stock_quotes/stock_quote/price[@type='open']");
XPathStreamFactoryを作成します。このファクトリ・クラスを使用して、XMLInputStreamに対して評価するStreamXPathオブジェクトのセットを指定し、XPathに一致するものが見つかった場合にコールバックを登録するためのオブザーバ(XPathStreamObserverインタフェースを使用する)を作成します。次の例では、XPathStreamFactoryの作成方法を示します。
XPathStreamFactory factory = new XPathStreamFactory();
XPathStreamFactory.install()メソッドを使用し、1番目のStreamXPathパラメータでXPath式を、2番目のXPathStreamObserverパラメータでオブザーバを指定して、オブザーバを作成およびインストールします。次の例は、無名クラスを使用してXPathStreamObserverインタフェースを実装する方法を示します。observe()メソッドの実装は、コールバックを受け取ったときにメッセージの出力だけを行います。例では、observeAttribute()メソッドとobserveNamespace()メソッドは何もしません。
factory.install(symbols, new XPathStreamObserver () {
public void observe(XMLEvent event) {
System.out.println("Matched a quote: "+event);
}
public void observeAttribute(StartElement e, Attribute a) {}
public void observeNamespace(StartElement e, Attribute a) {}
}
);
XMLドキュメントからXMLInputStreamを作成します。
String file = "stocks.xml";
XMLInputStream sourceStream =
XMLInputStreamFactory.newInstance().newInputStream(new File(file));
XPathStreamFactoryのcreateStream()メソッドを使用して、元のXMLInputStreamに対してXPathのマッチングを実行する新しいXMLInputStreamを作成します。
XMLInputStream matchingStream =
factory.createStream(sourceStream);
新しいXMLInputStreamを反復処理します。反復処理中にXPathに一致するものが見つかった場合、登録済みのオブザーバに通知されます。
while(matchingStream.hasNext()) {
XMLEvent event = matchingStream.next();
}
WebLogic XPath APIのAPIリファレンスの追加情報は、Oracle WebLogic Server Java APIリファレンスのweblogic.xml.xpathに関する項を参照してください。