Oracle® Fusion Middleware Oracle WebLogic Server 10.3.6 JAX-WS Webサービスの高度な機能のプログラミング 11g リリース1 (10.3.6) B61633-07 |
|
![]() 前 |
![]() 次 |
この章では、WebLogic Server 10.3.6 Java API for XML Web Services (JAX-WS)を使用したWebLogic Webサービスの転送を最適化するために、SOAPメッセージを添付ファイルとして送信する方法について説明します。
この章の内容は以下のとおりです。
SOAP MTOM/XOP (Message Transmission Optimization Mechanism/XML-binary Optimized Packaging)では、SOAPメッセージ内のxs:base64Binary
型またはxs:hexBinary
型のXMLデータの転送を最適化する方法が定義されています。トランスポート・プロトコルがHTTPの場合、Multipurpose Internet Mail Extension (MIME)添付ファイルを使用して、送信側と受信側の両方に対して同時にSOAPメッセージ内のXMLデータへの直接アクセスを許可する間にデータを伝達します。このとき、base64Binary
またはhexBinary
データのマーシャリングにMIMEアーティファクトが使用されていたことを意識する必要はありません。
バイナリ・データ最適化プロセスの手順は次のとおりです:
バイナリ・データのエンコード
SOAPエンベロープからのバイナリ・データの削除
バイナリ・データの圧縮
MIMEパッケージへのバイナリ・データの添付
SOAPエンベロープ内のMIMEパッケージへの参照の追加
MTOM/XOPのサポートは、JWSアノテーションの使用によって、JAX-WSでは標準となっています。MTOM仕様では、MTOMが有効化されている場合に、base64binary
またはhexBinary
データの送信時にWebサービスのランタイムでXOPバイナリ最適化を使用することは必須ではありません。むしろ、この仕様では、ランタイムがこれを選択して行うようになっています。これは場合によっては、直接SOAPメッセージ内にバイナリ・データを送信するほうが、より効率的であるとランタイムで判断されることがあるためです。一例としては、トランスポートされるデータ量が少なく、単にデータをそのままインライン処理するよりも多くのリソースが、会話およびトランスポートのオーバーヘッドにより消費されてしまう場合が挙げられます。
デフォルトでbase64Binary
XMLデータ型にマップされるJavaタイプは、javax.activation.DataHandler
、java.awt.Image
とjavax.xml.transform.Source
です。base64Binary
またはhexBinary
型の要素は、デフォルトでbyte[]
にマップされます。
次の表に、MTOM/XOPを使用してbase64Binary
またはhexBinary
型の添付ファイルを送信する手順をまとめます。
表13-1 MTOM/XOPを使用してバイナリ・データを送信する手順
# |
手順 | 説明 |
---|---|---|
1 |
MTOM添付ファイルとして使用する予定のデータ型のアノテーションを追加します。(オプション) |
使用するプログラミング・モデルに応じ、JavaクラスまたはWSDLにアノテーションを追加して、バイナリ・データの送信に使用するコンテンツ・タイプを定義できます。この手順はオプションです。XMLバイナリ型は、デフォルトではJava |
2 |
WebサービスでMTOMを有効にします。 |
「WebサービスでMTOMの有効化」を参照してください。 |
3 |
WebサービスのクライアントでMTOMを有効にします。 |
「クライアントでMTOMの有効化」を参照してください。 |
4 |
添付ファイルのしきい値の設定 |
|
詳細は、次を参照してください。
MTOMの仕様(http://www.w3.org/TR/soap12-mtom
)
XOPの仕様(http://www.w3.org/TR/xop10
)
使用するプログラミング・モデルに応じ、JavaクラスまたはWSDLにアノテーションを追加して、バイナリ・データの送信に使用するMIMEコンテンツ・タイプを定義できます。この手順はオプションです。
次の表に、MIMEコンテンツ・タイプとJavaタイプのマッピングを定義します。型によっては、デフォルトのマッピングが存在します。デフォルトのマッピングが存在しないMIMEコンテンツ・タイプは、DataHandler
にマップされます。
表13-2 MIMEコンテンツ・タイプとJava型のマッピング
MIMEコンテンツ・タイプ | Java型 |
---|---|
image/gif |
java.awt.Image |
image/jpeg |
java.awt.Image |
text/plain |
java.lang.String |
text/xml or application/xml |
javax.xml.transform.Source |
*/* |
javax.activation.DataHandler |
以下の節では、データ型のアノテーションを追加する方法について説明します。Javaから始める方法と、WSDLから始める方法があります。
バイナリ・データの送信に使用するコンテンツ・タイプの定義をJavaから始める場合は、バイナリ・データを保持するフィールドに@XmlMimeType
アノテーションを追加します。
バイナリ・データを保持するフィールドは、DataHandler
型にする必要があります。
次のサンプルに、バイナリ・データを保持するJavaクラス内のフィールドにアノテーションを追加する方法を示します。
@WebMethod @Oneway public void dataUpload( @XmlMimeType("application/octet-stream") DataHandler data) { }
バイナリ・データの送信に使用するコンテンツ・タイプの定義をWSDLから始める場合は、以下のいずれかの属性を使用して、xs:base64Binary
またはxs:hexBinary
型のWSDL要素にアノテーションを追加します。
xmime:contentType
- この要素のコンテンツ・タイプを定義します。
xmime:expectedContentType
- バイナリ・データとして容認するメディア・タイプの範囲を定義します。
次のサンプルでは、base64binary
型のimage
要素を、java.awt.Image
Javaタイプにマップされるimage/gif
MIMEタイプにマップしています。
<element name="image" type="base64Binary" xmime:expectedContentTypes="image/gif" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"/>
次の項で説明しているように、アノテーションまたはWS-Policyファイルを使用してWebサービスでMTOMを有効にすることができます。
WebサービスでMTOMを有効にするには、次のサンプルのようにサービス・エンドポイント実装クラスに@java.xml.ws.soap.MTOM
アノテーションを指定します。関連するコードは太字で示されています。
package examples.webservices.mtom;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.soap.MTOM;
@MTOM
@WebService(name="MtomPortType",
serviceName="MtomService",
targetNamespace="http://example.org")
public class MTOMImpl {
@WebMethod
public String echoBinaryAsString(byte[] bytes) {
return new String(bytes);
}
}
前の項で説明したように、@MTOMアノテーションに加えて、WebLogic JAX-WS WebサービスでのMTOM/XOPのサポートはあらかじめパッケージ化されたWS-PolicyファイルMtom.xml
を使用して実装されます。WS-Policyファイルは、http://www.w3.org/TR/ws-policyで記述されるWS-Policy
仕様に準拠しています。この仕様では、WEBサービスのポリシー(この場合は、バイナリ・データ送信のためのMTOM/XOPの使用)を記述および通信する汎用モデルおよびXML構文を提供しています。WebサービスWSDLのtypes
セクションへの、あらかじめパッケージ化されたMtom.xml
WS-Policyファイルのインストールは、次のようになります(参考のためにのみ掲載しています。このファイルを変更することはできません)。
<wsp:Policy wsu:Id="myService_policy"> <wsp:ExactlyOne> <wsp:All> <wsoma:OptimizedMimeSerialization xmlns:wsoma="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization" /> </wsp:All> </wsp:ExactlyOne> </wsp:Policy>
コンパイルされたJWSファイルをWebLogic Serverにデプロイすると、MTOM WS-Policyファイルを参照する次のスニペットが動的WSDLに自動的に含まれます。このスニペットでは、WebサービスがMTOM/XOPを使用することを示しています。
<wsdl:binding name="BasicHttpBinding_IMtomTest" type="i0:IMtomTest"> <wsp:PolicyReference URI="#myService_policy" /> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
JWSファイルで@Policy
メタデータ・アノテーションを指定することによって、開発時にWebサービスとMtom.xml
WS-Policyファイルを関連付けることができます。動的WSDLに、必須であるMtom.xml
ファイルへの参照が確実に含まれるよう、必ずattachToWsdl=true
属性も指定します。下記の例を参照してください。
デプロイメント時にWebサービスとMtom.xml
WS-Policyファイルを関連付けるには、デプロイメント直前にtypesセクションにポリシーを追加し、WSDLを修正します。
また、管理コンソールを使用して実行時にファイルを追加できます。詳細は、『Oracle WebLogic Server管理コンソール・ヘルプ』のWS-PolicyファイルとWebサービスとの関連付けに関する項を参照してください。この節では、JWSアノテーションの使用方法について説明します。
次の簡単なJWSファイルの例では、JWSファイルで@weblogic.jws.Policy
アノテーションを使用して、あらかじめパッケージ化されたMtom.xml
ファイルをWebサービスに適用することを指定する方法を示します(該当するコードは太字で示してあります)。
package examples.webservices.mtom; import javax.jws.WebMethod; import javax.jws.WebService; import weblogic.jws.Policy; @WebService(name="MtomPortType", serviceName="MtomService", targetNamespace="http://example.org") @Policy(uri="policy:Mtom.xml", attachToWsdl=true) public class MtomImpl { @WebMethod public String echoBinaryAsString(byte[] bytes) { return new String(bytes); }
WebサービスのクライアントでMTOMを有効にするには、次のサンプルのように、Webサービスのプロキシまたはディスパッチの作成時にパラメータとしてjavax.xml.ws.soap.MTOMFeature
のインスタンスを渡します。関連するコードは太字で示されています。
package examples.webservices.mtom.client;
import javax.xml.ws.soap.MTOMFeature;
public class Main {
public static void main(String[] args) {
String FOO = "FOO";
MtomService service = new MtomService()
MtomPortType port = service.getMtomPortTypePort(new MTOMFeature());
String result = null;
result = port.echoBinaryAsString(FOO.getBytes());
System.out.println( "Got result: " + result );
}
}
xs:binary64
データをインラインまたは添付ファイルとして送信する場合に指定する添付ファイルのしきい値を設定できます。デフォルトの添付ファイルのしきい値は0バイトです。すべてのxs:binary64
データは添付ファイルとして送信されます。
添付ファイルのしきい値を設定する方法は以下のとおりです。
Webサービスで、threshold
属性を@java.xml.ws.soap.MTOM
アノテーションに渡します。例:
@MTOM(threshold=3072)
Webサービスのクライアントで、しきい値をjavax.xml.ws.soap.MTOMFeature
に渡します。例:
MtomPortType port = service.getMtomPortTypePort(new MTOMFeature(3072));
上のどちらの例でも、メッセージが3KB以上だと添付ファイルとして送信されます。それ以外の場合、コンテンツはSOAPメッセージ本文の一部としてインラインで送信されます。
注意: com.sun.xml.ws.developer.StreamingDataHandler APIは、JAX-WS RIの拡張としてサポートされています。このAPIはWebLogicソフトウェアの一部としては提供されないため、変更される可能性があります。 |
MTOMと、javax.activation.DataHandler
およびcom.sun.xml.ws.developer.StreamingDataHandler
APIを使用すると、添付ファイルを含む着信SOAPメッセージを読み取る際に、デフォルト動作としてメッセージ全体をメモリーに読み込むかわりに、WebサービスでストリーミングAPIを使用することを指定できます。この機能を使用すると、SOAPメッセージが非常に大きいWebサービスのパフォーマンスを向上させることができます。
注意: ストリームMTOMはメッセージの暗号化と組み合せて使用できません。 |
以降の節では、クライアント側およびサーバー側でSOAP添付ファイルのストリーミングを使用する方法について説明します。
次のサンプルでは、クライアント側でSOAP添付ファイルのストリーミングを使用する方法を示します。
package examples.webservices.mtomstreaming.client; import java.util.Map; import java.io.InputStream; import javax.xml.ws.soap.MTOMFeature; import javax.activation.DataHandler; import javax.xml.ws.BindingProvider; import com.sun.xml.ws.developer.JAXWSProperties; import com.sun.xml.ws.developer.StreamingDataHandler; public class Main { public static void main(String[] args) { MtomStreamingService service = new MtomStreamingService(); MTOMFeature feature = new MTOMFeature(); MtomStreamingPortType port = service.getMtomStreamingPortTypePort( feature); Map<String, Object> ctxt=((BindingProvider)port).getRequestContext(); ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192); DataHandler dh = new DataHandler(new FileDataSource("/tmp/example.jar")); port.fileUpload("/tmp/tmp.jar",dh); DataHandler dhn = port.fileDownload("/tmp/tmp.jar"); StreamingDataHandler sdh = (StreamingDataHandler)dhn; try{ File file = new File("/tmp/tmp.jar"); sdh.moveTo(file); sdh.close(); } catch(Exception e){ e.printStackTrace(); } } }
このサンプルでは以下を行っています。
WebサービスのクライアントでMTOMを有効にし、Webサービスのプロキシまたはディスパッチの作成時にパラメータとしてjavax.xml.ws.soap.MTOMFeature
のインスタンスを渡します。
MTOMストリーミング・クライアントでのHTTPチャンクを有効にすることで、HTTPストリーミングのサポートを構成します。
Map<String, Object> ctxt = ((BindingProvider)port).getRequestContext(); ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192);
port.fileUpload
メソッドを呼び出します。
DataHandler
をStreamingDataHandler
にキャストし、StreamingDataHandler.readOnce()
メソッドを使用して添付ファイルを読み込みます。
次のサンプルでは、サーバー側でSOAP添付ファイルのストリーミングを使用する方法を示します。
package examples.webservices.mtomstreaming; import java.io.File; import java.jws.Oneway; import javax.jws.WebMethod; import java.io.InputStream; import javax.jws.WebService; import javax.xml.bind.annotation.XmlMimeType; import javax.xml.ws.WebServiceException; import javax.xml.ws.soap.MTOM; import javax.activation.DataHandler; import javax.activation.FileDataSource; import com.sun.xml.ws.developer.StreamingAttachment; import com.sun.xml.ws.developer.StreamingDataHandler; @StreamingAttachment(parseEagerly=true, memoryThreshold=40000L) @MTOM @WebService(name="MtomStreaming", serviceName="MtomStreamingService", targetNamespace="http://example.org", wsdlLocation="StreamingImplService.wsdl") @Oneway @WebMethod public class StreamingImpl { // Use @XmlMimeType to map to DataHandler on the client side public void fileUpload(String fileName, @XmlMimeType("application/octet-stream") DataHandler data) { try { StreamingDataHandler dh = (StreamingDataHandler) data; File file = new File(fileName); dh.moveTo(file); dh.close(); } catch (Exception e) { throw new WebServiceException(e); } @XmlMimeType("application/octet-stream") @WebMethod public DataHandler fileDownload(String filename) { return new DataHandler(new FileDataSource(filename)); } }
このサンプルでは以下を行っています。
ストリームSOAP添付ファイルを構成するには、@StreamingAttachement
アノテーションを使用します。詳細については、「SOAP添付ファイルのストリーミングの構成」を参照してください。
DataHandler
をマップするため、@XmlMimeType
アノテーションを以下のように使用します。
WSDLから始める場合は、生成されたSEIでxmime:expectedContentTypes="application/octet-stream"
をDataHandler
にマップするために使用します。
Javaから始める場合は、生成されたWSDLで適切なスキーマ・タイプを生成するために使用します。
DataHandler
をStreamingDataHandler
にキャストし、StreamingDataHandler.moveTo(File)
メソッドを使用して添付されたコンテンツをファイルに格納します。
クライアント側およびサーバー側でのSOAP添付ファイルのストリーミングは、以下を指定することで構成できます。
大きな添付ファイルを格納するディレクトリ。
ストリーミング添付ファイルを徹底的に解析するかどうか。
メモリーに格納できる添付ファイルの最大サイズ(バイト)。添付ファイルのサイズが指定したバイト数を超える場合はファイルに書き込まれます。
注意: com.sun.xml.ws.developer.StreamingAttachment APIは、JDK 6.0の拡張としてサポートされています。このAPIはJDK 6.0キットの一部としては提供されないため、変更される可能性があります。 |
サーバーでSOAP添付ファイルのストリーミングを構成するには、エンド・ポイント実装で@StreamingAttachment
アノテーションを追加します。次のサンプルでは、ストリーミング添付ファイルを徹底的に解析すること(完全な添付ファイルの読取りまたは書込み)を指定し、メモリーのしきい値を4MBに設定しています。4MB以下の添付ファイルはメモリーに格納されます。
... import com.sun.xml.ws.developer.StreamingAttachment; import javax.jws.WebService; @StreamingAttachment(parseEagerly=true, memoryThreshold=4000000L) @WebService(name="HelloWorldPortType", serviceName="HelloWorldService") public class StreamingImpl { }
注意: com.sun.xml.ws.developer.StreamingAttachmentFeature APIは、JDK 6.0の拡張としてサポートされています。このAPIはJDK 6.0キットの一部としては提供されないため、変更される可能性があります。 |
クライアントでSOAP添付ファイルのストリーミングを構成するには、StreamingAttachmentFeature
オブジェクトを作成し、PortType
スタブ実装の作成時に引数として渡します。次のサンプルでは、大きなファイルを格納するディレクトリを/tmp
に設定し、ストリーミング添付ファイルを徹底的に解析することを指定した上で、メモリーのしきい値を4MBに設定しています。4MB以下の添付ファイルはメモリーに格納されます。
... import com.sun.xml.ws.developer.StreamingAttachmentFeature; ... MTOMFeature mtom = new MTOMFeature(); StreamingAttachmentFeature stf = new StreamingAttachmentFeature("/tmp", true, 4000000L); MtomStreamingService service = new MtomStreamingService(); MtomStreamingPortType port = service.getMtomStreamingPortTypePort( mtom, stf); ...
また、表13-3に定義されている仕様は、swaRef
XML添付型を使用して添付ファイル付きSOAPメッセージを送信するメカニズムを定義しています。
表13-3 添付ファイル付きSOAPメッセージの送信をサポートする仕様
仕様 | 説明 |
---|---|
SOAP With Attachments (SwA) |
添付ファイルをSOAPメッセージでパッケージ化するためのMIME |
WS-I Attachments Profile |
添付ファイルへの参照をコンテンツID (CID)のURLとして表すためにWSDL記述で使用可能な JAXBは、 詳細は、 |
次の例では、WSDLファイルでswaRef
を使用して、claimForm
リクエスト・メッセージおよびレスポンス・メッセージが添付ファイルとして渡されるように指定する方法を示します。
例13-1 swaRefデータ型を使用したWSDLファイルの例
<?xml version="1.0" encoding="utf-8"?> <wsdl:definitions name="SOAPBuilders-mime-cr-test" xmlns:types="http://example.org/mime/data" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://example.org/mime" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://example.org/mime"> <wsdl:types> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.org/mime/data" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" elementFormDefault="qualified" xmlns:ref="http://ws-i.org/profiles/basic/1.1/xsd"> <import namespace="http://ws-i.org/profiles/basic/1.1/xsd" schemaLocation="WS-ISwA.xsd"/> . . . <complexType name="claimFormTypeRequest"> <sequence> <element name="request" type="ref:swaRef"/> </sequence> </complexType> <complexType name="claimFormTypeResponse"> <sequence> <element name="response" type="ref:swaRef"/> </sequence> </complexType> <element name="claimFormRequest" type="types:claimFormTypeRequest"/> <element name="claimFormResponse" type="types:claimFormTypeResponse"/> </schema> </wsdl:types> . . . <wsdl:message name="claimFormIn"> <wsdl:part name="data" element="types:claimFormRequest"/> </wsdl:message> <wsdl:message name="claimFormOut"> <wsdl:part name="data" element="types:claimFormResponse"/> </wsdl:message> . . . <wsdl:portType name="Hello"> . . . <wsdl:operation name="claimForm"> <wsdl:input message="tns:claimFormIn"/> <wsdl:output message="tns:claimFormOut"/> </wsdl:operation> </wsdl:portType> . . . </wsdl:definitions>
例13-1のWSDLの例で指定したように、swaRef
型としてタグ付けされたXMLコンテンツはMIME添付ファイルとして送信され、例13-2に示すように、SOAP本体内の要素でこの添付ファイルへの参照が保持されます。
例13-2 MIME添付ファイル付きSOAPメッセージの例
Content-Type: Multipart/Related; start-info="text/xml"; type="application/xop+xml"; boundary="----=_Part_4_32542424.1118953563492"Content-Length: 1193SOAPAction: "" ------=_Part_5_32550604.1118953563502Content-Type: application/xop+xml; type="text/xml"; charset=utf-8 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <request xmlns="http://example.org/mtom/data"> cid:b0a597fd-5ef7-4f0c-9d85-6666239f1d25@example.jaxws.sun.com </request> </soapenv:Body> </soapenv:Envelope> ------=_Part_5_32550604.1118953563502 Content-Type: application/xmlContent-ID: <b0a597fd-5ef7-4f0c-9d85-6666239f1d25@example.jaxws.sun.com> <?xml version="1.0" encoding="UTF-8"?><application xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocaption="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd" version="1.4"> <display-name>Simple example of application</display-name> <description>Simple example</description> <module> <ejb>ejb1.jar</ejb> </module> <module> <ejb>ejb2.jar</ejb> </module> <module> <web> <web-uri>web.war</web-uri> <context-root>web</context-root></web> </module></application>
例13-3では、claimForm
操作を定義するWebサービスのサンプルを示します。WSDLに定義されているように、リクエスト・メッセージおよびレスポンス・メッセージは、MIME添付ファイルとして送信されます。
例13-3 Webサービスの例
package mime.server;
import javax.jws.WebService;
import javax.xml.ws.Holder;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.activation.DataHandler;
import java.awt.*;
import java.io.ByteArrayInputStream;
@WebService (endpointInterface = "mime.server.Hello")
public class HelloImpl {
...
public ClaimFormTypeResponse claimForm(ClaimFormTypeRequest data){
ClaimFormTypeResponse resp = new ClaimFormTypeResponse();
resp.setResponse(data.getRequest());
return resp;
}
...
}
例13-4では、claimForm
操作を呼び出すWebサービス・クライアントのサンプルを示します。添付ファイルとして転送されるクライアント・リクエスト・データは、DataHandler
データ型にマップされます。
例13-4 MIME添付ファイルを使用したWebサービス・クライアントの例
package mime.client; import javax.xml.transform.stream.StreamSource; import javax.xml.transform.Source; import javax.activation.DataHandler; import java.io.ByteArrayInputStream; import java.awt.*; public class MimeApp { public static void main (String[] args){ try { Object port = new HelloService().getHelloPort (); testSwaref ((Hello)port); } catch (Exception ex) { ex.printStackTrace (); } } private static void testSwaref (Hello port) throws Exception{ DataHandler claimForm = new DataHandler (new StreamSource( new ByteArrayInputStream(sampleXML.getBytes())), "text/xml"); ClaimFormTypeRequest req = new ClaimFormTypeRequest(); req.setRequest(claimForm); ClaimFormTypeResponse resp = port.claimForm (req); DataHandler out = resp.getResponse(); ... } private static final String sampleXML = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?> \n" + "<NMEAstd>\n" + "<DevIdSentenceId>$GPRMC</DevIdSentenceId>\n" + "<Time>212949</Time>\n" + "<Navigation>A</Navigation>\n" + "<NorthOrSouth>4915.61N</NorthOrSouth>\n" + "<WestOrEast>12310.55W</WestOrEast>\n" + "<SpeedOnGround>000.0</SpeedOnGround>\n" + "<Course>360.0</Course>\n" + "<Date>030904</Date>\n" + "<MagneticVariation>020.3</MagneticVariation>\n" + "<MagneticPoleEastOrWest>E</MagneticPoleEastOrWest>\n" + "<ChecksumInHex>*6B</ChecksumInHex>\n" + "</NMEAstd>"; }