WebLogic XML プログラマーズ ガイド
以下の節では、次の高度な XML API の使い方に関する情報を提供します。
WebLogic XPath API には、DOM
、XMLInputStream
、または XMLOutputStream
として表現されるドキュメントに対して XPath のマッチングを実行するために必要となる、すべてのクラスが入っています。この API は、指定したパターンに適合する XML ドキュメント内の XML 要素のサブセットを識別する場合に使用します。
WebLogic XPath API の詳細な API リファレンスについては、weblogic.xml.xpath の Javadoc を参照してください。
この節では、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>
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;
/**
* このクラスは、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
{
// ドキュメントの DOM 表現の作成
String file = "purchaseorder.xml";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true); // この例にはあまり関係がない
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(file);
// ドキュメントに対して評価するための DOMXPath の
// インスタンスを作成する
DOMXPath totalItems = // 項目数のカウント
new DOMXPath("count(purchaseorder/item)");
DOMXPath atLeast10 = // 数量 >= 10 の項目のタイトル
new DOMXPath("purchaseorder/item[quantity >= 10]/title");
// ドキュメントに対して項目を評価する
double count = totalItems.evaluateAsNumber(doc);
Set nodeset = atLeast10.evaluateAsNodeset(doc);
// 結果を出力
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());
}
}
// この時点で、他のドキュメントに対して
// atLeast10 および totalItems を引き続き使用できる
}
}
次の手順では、DOM
として表現される XML ドキュメントに対して XPath のマッチングを実行するために、DOMXPath
クラスを使用する主な手順について説明します。
String file = "purchaseorder.xml";
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(file);
次の例では、発注書内の項目数をカウントする XPath 式を示します。
DOMXPath totalItems =
new DOMXPath("count(purchaseorder/item)");
次の例では、数量が 10 以上の項目を持つタイトルを返す XPath 式を示します。
DOMXPath atLeast10 =
new DOMXPath("purchaseorder/item[quantity >= 10]/title");
DOMXPath.evaluateAs
XXX
()
メソッドの 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 リファレンスについては、weblogic.xml.xpath の Javadoc を参照してください。
次の例では、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>
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;
/**
* このクラスは、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
{
// このストリームに対して照合する 2 つの XPath 用に StreamXPath の
// インスタンスを作成する
StreamXPath symbols =
new StreamXPath("stock_quotes/stock_quote");
StreamXPath openingPrices =
new StreamXPath("stock_quotes/stock_quote/price[@type='open']");
// XPathStreamFactory を作成する
XPathStreamFactory factory = new XPathStreamFactory();
// XPathStreamObserver を 2 つ作成してインストールする。この場合、
// 無名クラスを使用して、コールバックを受け取ったときに
// メッセージを出力する。指定したオブザーバは複数の XPath を監視できる。
// 指定した XPath は複数のオブザーバで
// 監視できる
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) {} // 無視する
});
// 開始要素と終了要素の両方に一致するものを見つける。
// これは空要素の <price/> の場合であっても同様。
// これは基底のストリーミング パーサの動作
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) {} // 無視する
public void observeNamespace(StartElement e, Attribute a) {} // 無視する
});
// ドキュメントの XMLInputStream を取得する
String file = "stocks.xml";
XMLInputStream sourceStream = XMLInputStreamFactory.newInstance().
newInputStream(new File(file));
// ファクトリを使用して、ソース ストリームに対して XPath のマッチングを実行する
// XMLInputStream を作成する
XMLInputStream matchingStream = factory.createStream(sourceStream);
// ストリームを反復処理する
System.out.println("Matching against xml stream from "+file);
while(matchingStream.hasNext()) {
// この例ではイベントに関して何もしない。
// ファクトリにインストールした XPathStreamObserver インスタンスが
// 該当するイベントのコールバックを受け取る
XMLEvent event = matchingStream.next();
}
}
}
次の手順では、XMLInputStream
として表現される XML ドキュメントに対して XPath のマッチングを実行するために、StreamXPath
クラスを使用する主な手順について説明します。
次の例では、XML ドキュメントで株価を検索する XPath 式を示します。
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) {}
}
);
String file = "stocks.xml";
XMLInputStream sourceStream =
XMLInputStreamFactory.newInstance().newInputStream(new File(file));
XPathStreamFactory
の createStream()
メソッドを使用して、元の XMLInputStream
に対して XPath のマッチングを実行する新しい XMLInputStream
を作成します。
XMLInputStream matchingStream =
factory.createStream(sourceStream);
while(matchingStream.hasNext()) {
XMLEvent event = matchingStream.next();
}
WebLogic XPath API の詳細な API リファレンスについては、weblogic.xml.xpath の Javadoc を参照してください。
WebLogic XML デジタル署名 API には、SOAP メッセージに対してデジタル署名および検証を行うクラスが含まれています。この API は、weblogic.webservice.core.soap パッケージに入っています。
次の表では、XML デジタル署名 API の 2 つのメイン クラスを示します。
API を使用している場合、XMLSignatureInvalidException
の送出は、署名が無効であることを示し、XMLSignatureMalformedException
の送出は、SOAP メッセージを処理できないことを示します。
警告 : WebLogic XML デジタル署名 API は、RSA 暗号化でしか使用できません。
以下のサンプル クライアント アプリケーションでは、WebLogic XML デジタル署名 API を使用する簡単な方法を示します。XMLSignature.sign()
メソッドを使用して、java.io.InputStream
として表現される署名なしの SOAP メッセージを読み込み、その後、java.io.OutputStream
として表現される、クライアントのプライベート キーおよびデジタル証明書を使用して得られた署名済みの SOAP メッセージを書き込む方法が、この Java コードの太字部分で示されています。また、このプログラムでは、署名された SOAP メッセージを検証し、メッセージ内にあるデジタル証明書を出力する方法も示します。
import weblogic.webservice.core.soap.XMLSignature;
import weblogic.webservice.core.soap.ValidateResult;
import java.security.cert.X509Certificate;
import java.security.PrivateKey;
import java.security.Key;
import java.security.KeyStore;
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
* SOAP メッセージに対する署名および検証の方法を示すサンプル クライアント アプリケーション
*
* Copyright (c) 2003 by BEA Systems.All Rights Reserved.
*/
public class SignSOAPMessage {
private static final String CLIENT_KEYSTORE = "clientkeystore";
private static final String KEYSTORE_PASS = "mypasswd";
private static final String KEYNAME = "clientkey";
private static final String KEYPASS = "clientpass";
private static final String signedXML = "soap-signed.xml";
private static Key getPrivateKey(String keyname,
String password,
String keystore) throws Exception {
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(keystore), KEYSTORE_PASS.toCharArray());
Key result = ks.getKey(keyname, password.toCharArray());
return result;
}
private static X509Certificate getCertificate(String keyname,
String keystore) throws Exception {
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(keystore), KEYSTORE_PASS.toCharArray());
X509Certificate result = (X509Certificate) ks.getCertificate(keyname);
return result;
}
public static void main(String[] args) throws Exception {
X509Certificate clientcert = getCertificate(KEYNAME, CLIENT_KEYSTORE);
PrivateKey clientprivate = (PrivateKey) getPrivateKey(KEYNAME,
KEYPASS, CLIENT_KEYSTORE);
ValidateResult result;
if (args[1].equals("sign")) {
XMLSignature.sign(new FileInputStream(args[0]), new FileOutputStream(signedXML), clientcert, clientprivate);
result = XMLSignature.validate(new FileInputStream(signedXML));
} else {
result = XMLSignature.validate(new FileInputStream(args[1]));
}
System.out.println("Cert: " + result.getCertificates());
}
}