ADOS Developer's Site - XML Stadium |
目次
ServiceContentのノードツリーの参照方法を解説します。XMLの内容を自動的にDBへ出力する場合などに有効です。
サンプルプログラムを以下に示します。
【SampleUtils.java】
32 : public static void printServiceContentInformation(ServiceContent sc) { 33 : System.out.println("PIP :" + sc.getPIPID()); 34 : System.out.println("Ver :" + sc.getFullVersion()); 35 : System.out.println("Root :" + sc.getName()); 36 : System.out.print("Production :"); 37 : if (sc.isProduction()) 38 : System.out.println("Production"); 39 : else 40 : System.out.println("Test"); 41 : System.out.println("DOC ID :" + sc.getDocumentIdentifier()); 42 : System.out.println("Date :" 43 : + sc.getDocumentGenerationDateTime().getRNDateTime()); 44 : System.out.println("Sender DUNS :" 45 : + sc.getFromRole().getGlobalBusinessIdentifierNorm()); 46 : System.out.println("Receiver DUNS:" 47 : + sc.getToRole().getGlobalBusinessIdentifierNorm()); 48 : 49 : HashMap map = sc.getElement().getPrefixMap(); 50 : Iterator it = map.keySet().iterator(); 51 : while (it.hasNext()) { 52 : String uri = (String) it.next(); 53 : System.out.println(map.get(uri) + " : " + uri); 54 : } 55 : 56 : printComplexElementInformation((ComplexElement) sc.getElement(), ""); 57 : } 58 : 59 : public static void printComplexElementInformation(ComplexElement el, 60 : String indent) { 61 : System.out.println(indent + "C:" + el.getName() + ":" 62 : + el.getNamespace() + ":" + el.getClass().getCanonicalName()); 63 : 64 : ElementContentModel model = el.getElementContentModel(); 65 : 66 : printGroupDeclarationInformation(model.getRoot(), indent + INDENT); 67 : 68 : int att_size = el.getAttributeCount(); 69 : for (int i = 0; i < att_size; i++) { 70 : Attribute att = el.getAttribute(i); 71 : System.out.println(indent + INDENT + "A:" + att.getName() + ":" 72 : + att.getValue() + ":" + att.getClass().getCanonicalName()); 73 : } 74 : Element[] els = el.getElements(); 75 : for (int i = 0; i < els.length; i++) { 76 : if (els[i] instanceof ComplexElement) { 77 : printComplexElementInformation((ComplexElement) els[i], indent 78 : + INDENT); 79 : } else if (els[i] instanceof SimpleElement) { 80 : SimpleElement sel = (SimpleElement) els[i]; 81 : System.out.println(indent + INDENT + "S:" + sel.getName() + ":" 82 : + sel.getText() + ":" + sel.getNamespace() + ":" 83 : + sel.getClass().getCanonicalName()); 84 : System.out.println(indent + INDENT + INDENT + "D:" 85 : + sel.getTextModel().toString()); 86 : } else if (els[i] instanceof TextElement) { 87 : TextElement tel = (TextElement) els[i]; 88 : System.out.println(indent + INDENT + "T:" + tel.getName() + ":" 89 : + tel.getText() + ":" + tel.getNamespace() + ":" 90 : + tel.getClass().getCanonicalName()); 91 : } 92 : } 93 : } 94 : 95 : public static void printGroupDeclarationInformation(GroupDeclaration group, 96 : String indent) { 97 : switch (group.getType()) { 98 : case GroupDeclaration.GROUP_TYPE_SEQUENCE: 99 : System.out.println(indent + "D:SEQUENCE:" + group.getMinOccur() 100 : + ".." + group.getMaxOccur()); 101 : break; 102 : case GroupDeclaration.GROUP_TYPE_CHOICE: 103 : System.out.println(indent + "D:CHOICE:" + group.getMinOccur() 104 : + ".." + group.getMaxOccur()); 105 : break; 106 : } 107 : int count = group.getChildCnt(); 108 : for (int i = 0; i < count; i++) { 109 : Object o = group.getChild(i); 110 : if (o instanceof ElementDeclaration) { 111 : ElementDeclaration decl = (ElementDeclaration) o; 112 : System.out.println(indent + INDENT + "D:" + decl.getName() 113 : + " : " + decl.getNamespace() + " : " 114 : + decl.getMinOccur() + ".." + decl.getMaxOccur()); 115 : } else if (o instanceof GroupDeclaration) { 116 : printGroupDeclarationInformation((GroupDeclaration) o, indent 117 : + INDENT); 118 : } 119 : } 120 : }
なお、サンプルのPIPReceiverRJO.javaにおいて、これらのメソッドを利用しています。
受信したServiceContentを取得します。
【PIPReceiverRJO.java】
54 : SampleUtils.printServiceContentInformation(request 55 : .getServiceContent());
ServiceContentからPIP名等の基本情報を参照できます。
33 : System.out.println("PIP :" + sc.getPIPID()); 34 : System.out.println("Ver :" + sc.getFullVersion()); 35 : System.out.println("Root :" + sc.getName()); 36 : System.out.print("Production :"); 37 : if (sc.isProduction()) 38 : System.out.println("Production"); 39 : else 40 : System.out.println("Test"); 41 : System.out.println("DOC ID :" + sc.getDocumentIdentifier()); 42 : System.out.println("Date :" 43 : + sc.getDocumentGenerationDateTime().getRNDateTime()); 44 : System.out.println("Sender DUNS :" 45 : + sc.getFromRole().getGlobalBusinessIdentifierNorm()); 46 : System.out.println("Receiver DUNS:" 47 : + sc.getToRole().getGlobalBusinessIdentifierNorm());
関連クラス | 機能 |
com.ados.hestia.parser.rnbm.particle.ServiceContent | ServiceContentを表すクラス。 |
com.ados.hestia.parser.rnbm.particle.DateTimeStamp | ServiceContent#getDocumentGenerationDateTimeで取得される、ドキュメント生成時間を表すクラス。 |
com.ados.hestia.parser.rnbm.particle.PartnerRoleIdentification | ServiceContent#getFromRole/getToRoleで取得される、パートナー情報を表すクラス。 |
com.ados.hestia.parser.rnbm.particle.PartnerIdentification | PartnerRoleIdentificationの上位クラス。 |
ServiceContentに宣言されている名前空間URIおよび接頭辞を参照できます。
49 : HashMap map = sc.getElement().getPrefixMap(); 50 : Iterator it = map.keySet().iterator(); 51 : while (it.hasNext()) { 52 : String uri = (String) it.next(); 53 : System.out.println(map.get(uri) + " : " + uri); 54 : }
ServiceContentのルート要素を参照できます。
56 : printComplexElementInformation((ComplexElement) sc.getElement(), "");
RJOでは、具体的なPIPの各要素や属性ごとにクラスが定義されます。たとえば、PIP 3B2に対してはPip3B2AdvanceShipmentNotificationというルート要素のクラスが定義され、BusinessDescription要素に対してはBusinessDescriptionクラスが定義されます。それらのクラスは以下のような抽象クラスを継承しています。
+ Abstract(抽象クラス) + Element(抽象クラス) + ComplexElement(抽象クラス) + BusinessDescription + ContactInformation + ・・・ + RootElement(抽象クラス) + Pip3B2AdvanceShipmentNotification + Pip4A1StrategicForecastNotification + ・・・ + SimpleElement(抽象クラス) + GlobalBusinessIdentifier + FreeFormText + ・・・ + TextElement + Attribute(抽象クラス)
関連クラス | 機能 |
com.ados.hestia.parser.rnbm.model.RootElement | ServiceContent#getElementで取得される、ルート要素を表す抽象クラス。 |
com.ados.hestia.parser.rnbm.model.ComplexElement | 枝の要素を表す抽象クラス。 |
com.ados.hestia.parser.rnbm.model.SimpleElement | 葉(末端)の要素を表す抽象クラス。 |
com.ados.hestia.parser.rnbm.model.Attribute | 属性を表す抽象クラス。 |
ComplexElementは枝の要素を表します。
61 : System.out.println(indent + "C:" + el.getName() + ":" 62 : + el.getNamespace() + ":" + el.getClass().getCanonicalName());
Attributeを取得することができます。なお、getAttributeはComplexElementの上位クラスであるElementから継承されたメソッドです。
70 : Attribute att = el.getAttribute(i);
子のElementを取得することができます。なお、getElementsはComplexElementに定義されたメソッドです。
74 : Element[] els = el.getElements();
ElementContentModel(要素の型定義)を取得することができます。
64 : ElementContentModel model = el.getElementContentModel();
ElementContentModelは、GroupDeclarationとElementDeclarationが階層的に組み合わされた構造を持ちます。ElementContentModel#getRootにより、その頂点のGroupDeclarationを取得することができます。
66 : printGroupDeclarationInformation(model.getRoot(), indent + INDENT);
関連クラス | 機能 |
com.ados.hestia.parser.rnbm.model.ElementContentModel | 要素内容モデル(型定義)を表すクラス。 |
com.ados.hestia.parser.rnbm.model.GroupDeclaration | グループ(sequence、choice)を表すクラス。型定義の頂点のグループは、ElementContentModel#getRootで取得される。 |
com.ados.hestia.parser.rnbm.model.ElementDeclaration | 要素宣言を表すクラス。 |
Attributeは属性を表します。
71 : System.out.println(indent + INDENT + "A:" + att.getName() + ":" 72 : + att.getValue() + ":" + att.getClass().getCanonicalName());
80 : SimpleElement sel = (SimpleElement) els[i]; 81 : System.out.println(indent + INDENT + "S:" + sel.getName() + ":" 82 : + sel.getText() + ":" + sel.getNamespace() + ":" 83 : + sel.getClass().getCanonicalName()); 84 : System.out.println(indent + INDENT + INDENT + "D:" 85 : + sel.getTextModel().toString());
Copyright 2005-2008. ADOS Co., Ltd. All Rights Reserved. |