ナビゲーションをスキップ

WebLogic XML プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

高度な XML API の使い方

以下の節では、次の高度な XML API の使い方に関する情報を提供します。

 


WebLogic XPath API の使い方

WebLogic XPath API には、DOMXMLInputStream、または XMLOutputStream として表現されるドキュメントに対して XPath のマッチングを実行するために必要となる、すべてのクラスが入っています。この API は、指定したパターンに適合する XML ドキュメント内の XML 要素のサブセットを識別する場合に使用します。

WebLogic XPath API の詳細な API リファレンスについては、weblogic.xml.xpath の Javadoc を参照してください。

DOMXPath クラスの使い方

この節では、DOM として表現される XML ドキュメントに対して XPath のマッチングを実行するために、WebLogic XPath API の DOMXPath クラスを使用する方法について説明します。最初に例を示し、次にその例で使われている主な手順について説明します。

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;
/**
* このクラスは、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 を引き続き使用できる
  }
}

DOMXPath クラスを使用する場合の主な手順

次の手順では、DOM として表現される XML ドキュメントに対して XPath のマッチングを実行するために、DOMXPath クラスを使用する主な手順について説明します。

  1. 次に抜粋するコードのように、XML ドキュメントから org.w3c.dom.Document オブジェクトを作成します。
  2. String file = "purchaseorder.xml";
    DocumentBuilderFactory factory =
    DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(file);
  3. DOM に対して評価する XPath 式を表す DOMXPath オブジェクトを作成します。
  4. 次の例では、発注書内の項目数をカウントする XPath 式を示します。

     DOMXPath totalItems = 
    new DOMXPath("count(purchaseorder/item)");

    次の例では、数量が 10 以上の項目を持つタイトルを返す XPath 式を示します。

     DOMXPath atLeast10 = 
    new DOMXPath("purchaseorder/item[quantity >= 10]/title");
  5. DOMXPath.evaluateAsXXX() メソッドの 1 つを使用して、XPath 式を評価します。ここで、XXX は、戻り値のデータ型 (BooleanNodesetNumberString など) を表します。
  6. 次の例に、evaluateAsNumber() メソッドを使用して totalItems XPath 式を評価する方法を示します。

     double count = totalItems.evaluateAsNumber(doc);
    System.out.println(file+" contains "+count+" total items.");

    次の例では、evaluateAsNodeset() メソッドを使用して、標準的な方法で反復処理できる org.w3c.dom.NodesSet を返す方法を示します。

     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 を参照してください。

StreamXPath クラスの使い方

次の例では、WebLogic XPath API の StreamXPath クラスを使用して、XMLInputStream に対して XPath マッチングを実行する方法を示します。最初に例を示し、次にその例で使われている主な手順について説明します。この例では XMLInputStream に対してマッチングを実行する方法のみを示しますが、同様のコードを使用すれば XMLOutputStream に対してもマッチングを実行できます。

StreamXPath クラスの使用例

この節の最後に示すサンプル 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;
/**
* このクラスは、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();
    }
  }
}

StreamXPath クラスを使用する場合の主な手順

次の手順では、XMLInputStream として表現される XML ドキュメントに対して XPath のマッチングを実行するために、StreamXPath クラスを使用する主な手順について説明します。

  1. XMLInputStream に対して評価する XPath 式を表す StreamXPath オブジェクトを作成します。
  2. 次の例では、XML ドキュメントで株価を検索する XPath 式を示します。

    StreamXPath symbols =
    new StreamXPath("stock_quotes/stock_quote");

    次の例では、開始値を使用して株価を検索する XPath 式を示します。

    StreamXPath openingPrices = new   StreamXPath("stock_quotes/stock_quote/price[@type='open']");
  3. XPathStreamFactory を作成します。このファクトリ クラスを使用して、XMLInputStream に対して評価する StreamXPath オブジェクトのセットを指定し、XPath に一致するものが見つかった場合にコールバックを登録するためのオブザーバを作成します (XPathStreamObserver インタフェースを使用する)。次の例では、XPathStreamFactory の作成方法を示します。
  4. XPathStreamFactory factory = new XPathStreamFactory();
  5. XPathStreamFactory.install() メソッドを使用し、1 番目の StreamXPath パラメータで XPath 式を、2 番目の XPathStreamObserver パラメータでオブザーバを指定して、オブザーバを作成およびインストールします。次の例に、無名クラスを使用して XPathStreamObserver インタフェースを実装する方法を示します。observe() メソッドの実装は、コールバックを受け取ったときにメッセージの出力だけを行います。この例では、observeAttribute() メソッドと observeNamespace() メソッドは何も行いません。
  6. 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) {}
    }
    );
  7. XML ドキュメントから XMLInputStream を作成します。
  8. String file = "stocks.xml";
    XMLInputStream sourceStream =
    XMLInputStreamFactory.newInstance().newInputStream(new File(file));
  9. XPathStreamFactorycreateStream() メソッドを使用して、元の XMLInputStream に対して XPath のマッチングを実行する新しい XMLInputStream を作成します。
  10.  XMLInputStream matchingStream =
    factory.createStream(sourceStream);
  11. 新しい XMLInputStream を反復処理します。反復処理中に XPath に一致するものが見つかった場合、登録済みのオブザーバに通知されます。
  12. while(matchingStream.hasNext()) {
    XMLEvent event = matchingStream.next();
    }

WebLogic XPath API の詳細な API リファレンスについては、weblogic.xml.xpath の Javadoc を参照してください。

 


WebLogic XML デジタル署名 API の使い方

WebLogic XML デジタル署名 API には、SOAP メッセージに対してデジタル署名および検証を行うクラスが含まれています。この API は、weblogic.webservice.core.soap パッケージに入っています。

次の表では、XML デジタル署名 API の 2 つのメイン クラスを示します。

表 5-1 WebLogic XML デジタル署名 API のクラス

クラス

説明

XMLSignature

java.io.InputStream として表現される SOAP メッセージに対する署名および検証に使用されるメイン クラス。クライアントのデジタル証明書およびプライベート キーでメッセージにデジタル署名を行うには、sign() メソッドを使用する。SOAP メッセージが有効であることを確認するには、validate() メソッドを使用する。

ValidateResult

署名された SOAP メッセージの検証結果を表すクラス。署名された XML ドキュメント内のデジタル証明書のリストを返すには getCertificates() メソッドを使用する。

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());
  }
}

 

フッタのナビゲーションのスキップ  ページの先頭 前 次