- - PR -
要素のデフォルト値の取得方法について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-06-16 15:10
ある本で、省略可能な要素にデフォルト値が設定されていると、XMLインスタンスでその要素が省略されていた場合、パーサーでその要素の値を取得すると、デフォルト値が得られる有りました。
下記のスキーマとXMLを作成し、DOMパーサー(MSXML4.0)を使って、要素/Information/History[3]/Typeの値を取得したのですが、空文字が返ります。 だれか、デフォルト値の取得方法をご存知の方、いらっしゃいませんか? ===== 作成したスキーマ ===== <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="FormatVerRev" default="01.00"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="\\d{2}\\.\\d{2}"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="History"> <xs:complexType> <xs:sequence> <xs:element name="Date" type="xs:date"/> <xs:element name="Owner" type="xs:NMTOKEN" fixed="DG"/> <xs:element name="Type" default="public"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="public"/> <xs:enumeration value="protected"/> <xs:enumeration value="private"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Information"> <xs:complexType> <xs:sequence> <xs:element ref="FormatVerRev"/> <xs:element ref="History" maxOccurs="10"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> ===== 作成したXML ===== <?xml version="1.0" encoding="UTF-8"?> <Information xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="po.xsd"> <FormatVerRev>01.00</FormatVerRev> <History> <Date>2005-06-13</Date> <Owner>DG</Owner> <Type>public</Type> </History> <History> <Date>2005-06-14</Date> <Owner>DG</Owner> <Type>private</Type> </History> <History> <Date>2005-06-15</Date> <Owner>DG</Owner> <Type></Type> </History> </Information> |
|
投稿日時: 2005-06-16 16:47
MSXMLはよく知らないのですが、パース時に妥当性検証は行われているでしょうか。
|
|
投稿日時: 2005-06-16 18:05
パース時には、妥当性チェックを実施しています。
とりあえず、以下の順番で処理を行っています。 1.XSDファイルのロード 2.XSDのマッピング 3.XPathの使用宣言 4.名前空間の設定 5.XMLファイルのロード(パース) 6.要素値の取り出し |
|
投稿日時: 2005-06-17 16:55
デフォルト値を取得するのに、マッピングしたスキーマの情報を使用すると知りました。下記にコーディングを記載します。この方法が通常の手段なのでしょうか?
言語:C++ @の部分が通常の要素値(文字列)の取得 Aの部分が今回追加したデフォルト値取得処理 : : MSXML2::IXMLDOMNodePtr pNode = NULL; MSXML2::IXMLDOMNodePtr pRoot; long i; string xPath1 = "/Information/History"; printf("%s\\\\n", xPath1.c_str()); MSXML2::IXMLDOMNodeListPtr pList; if((pList=pXMLDoc->selectNodes(_bstr_t(xPath1.c_str()))) != NULL){ long e_cnt = pList->length; for(i=0; i<e_cnt ; i++){ char plusTag[128]; sprintf(plusTag,"%s[%d]/Type", (char*)xPath1.c_str(), i+1); string xPath2 = plusTag; printf("%s:", xPath2.c_str()); pRoot = pXMLDoc->documentElement; if((pNode=pRoot->selectSingleNode(_bstr_t(xPath2.c_str())))!=NULL){ //============================== // @要素の値(設定文字列)を取得 //============================== string val = (char*)pNode->text;// ここでデフォルト値も // 取得できる?⇒NG if(val.empty() == true){ //====================== // Aデフォルト値の取得 //====================== MSXML2::ISchemaElementPtr pSE = ((MSXML2::IXMLDOMSchemaCollection2Ptr)pXMLDoc->namespaces)->getDeclaration(pNode); val = (char*)pSE->defaultValue; if(val.empty() == false){ printf("[%s(default)]\\\\n", val.c_str()); } }else{ printf("[%s]\\\\n", val.c_str()); } }else{ printf("[element not found]\\\\n"); } } } printf("\\\\n"); : : |
1