- PR -

要素のデフォルト値の取得方法について

1
投稿者投稿内容
Ebataku
会議室デビュー日: 2005/06/16
投稿数: 4
投稿日時: 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>
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-06-16 16:47
MSXMLはよく知らないのですが、パース時に妥当性検証は行われているでしょうか。
Ebataku
会議室デビュー日: 2005/06/16
投稿数: 4
投稿日時: 2005-06-16 18:05
パース時には、妥当性チェックを実施しています。
とりあえず、以下の順番で処理を行っています。
1.XSDファイルのロード
2.XSDのマッピング
3.XPathの使用宣言
4.名前空間の設定
5.XMLファイルのロード(パース)
6.要素値の取り出し
Ebataku
会議室デビュー日: 2005/06/16
投稿数: 4
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)