スキーマ型情報へのアクセス
スキーマ型情報にアクセスするには、SchemaType プロパティを使用します。SchemaType プロパティは、値が組み込みの XML スキーマ定義言語 (XSD) 型と、ユーザー定義の型 (simpleType や complexType など) のいずれであるかに応じて、XmlSchemaType または XmlSchemaDataType を返します。
返される型の確認
返される型を確認するには、XmlValidatingReader クラスの SchemaType プロパティを使用します。
返される型を確認するサンプル コードを次に示します。
Dim obj As object = vreader.SchemaType
if (obj is XmlSchemaType)
XmlSchemaType st = obj.BaseSchemaType
if (obj is XmlSchemaDataType)
XmlSchemaDatatype vt = obj.ValueType
[C#]
object obj=vreader.SchemaType;
if (obj is XmlSchemaType)
XmlSchemaType st = obj.BaseSchemaType;
if (obj is XmlSchemaDataType)
XmlSchemaDatatype vt = obj.ValueType;
SchemaType プロパティの使用例については、「SchemaType プロパティ」を参照してください。
スキーマの検証
XML スキーマ (XSD) 検証または XDR (XML-Data Reduced) スキーマ検証を実行する場合は、読み込まれている現在の要素に応じて、XmlSchemaType または XmlSchemaDataType が返されます。
現在の要素や属性が単純な型である場合は、XmlSchemaDataType が返されます。また、現在の要素や属性がユーザー定義の複雑な型である場合は、XmlSchemaType が返されます。
SchemaType プロパティが XmlSchemaComplexType かどうかを確認するサンプル コードを次に示します。オブジェクトの値が、ReadTypedValue メソッドを使用して確認され、コンソールに書き込まれます。
while(vr.Read())
if(vr.NodeType = XmlNodeType.Element)
if (vr.SchemaType.ToString() = "System.Xml.Schema.XmlSchemaComplexType")
Dim sct as XmlSchemaComplexType = CType(vr.SchemaType,XmlSchemaComplexType)
Console.WriteLine("{0}({1})", vr.Name, sct.Name)
else
Dim value as object = vr.ReadTypedValue()
Console.WriteLine("{0}({1}):{2}", vr.Name, value.GetType().Name, value)
end if
end if
end while
[C#]
while (vr.Read())
{
if (vr.NodeType == XmlNodeType.Element)
{
if (vr.SchemaType is XmlSchemaComplexType)
{
XmlSchemaComplexType sct = (XmlSchemaComplexType)vr.SchemaType;
Console.WriteLine("{0}({1})", vr.Name, sct.Name);
}
else
{
object value = vr.ReadTypedValue();
Console.WriteLine("{0}({1}):{2}", vr.Name, value.GetType().Name, value);
}
}
}
文書型定義 (DTD: Document Type Definition) 検証を実行する場合、XmlSchemaType または XmlSchemaDataType は null 参照を返します。
Close メソッドを呼び出すと、このプロパティの値は null 参照に戻ります。現在のノードにスキーマ型がない場合、またはスキーマが存在しない場合は、null 参照が返されることがあります。
ReadTypedValue メソッドの使用
ReadTypedValue メソッドは、1 つのオブジェクトを読み込んで返します。このオブジェクトは、特定の XML スキーマ要素に対して、.NET Framework が型を割り当てたオブジェクトに対応します。たとえば、型が xs:int として定義されている場合は、そのオブジェクトに対して .NET Framework の Int32 型が返されます。
実行される操作は、現在のノードの型によって異なり、次の規則に基づいています。
- ノードが属性ノードである場合、リーダー (読み取り機能) は現在の位置にとどまります。
- ノードが要素ノードである場合、リーダーは、CDATA、テキスト、空白、重要度の高い (Significant) 空白、およびコメントを読み取る EndElement 上に配置されます。
- 型に方向の割り当て (NMTOKENS など) がない場合、その型は文字列として返されます。
- ValidationType プロパティが ValidationType.None に設定されている場合は、スキーマや DTD のデータ型情報は提供されません。
Close メソッドを呼び出すと、ReadTypedValue メソッドは null 参照を返します。
.NET Framework 型オブジェクトを読み込んで返すサンプル コードを次に示します。
Dim value as object = vr.ReadTypedValue()
[C#]
object value = vr.ReadTypedValue();
検証の種類
ValidationType プロパティ値が ValidationType.Schema または ValidationType.XDR に設定されている場合は、データ型情報を検出できますが、ValidationType.DTD または ValidationType.None に設定されている場合は、データ型情報は提供されません。
最初の行で XML スキーマ (XSD) データ型を検索するように ValidationType プロパティを設定し、2 番目の行で XDR データ型を検索するように設定するサンプル コードを次に示します。
vr.ValidationType = ValidationType.Schema
vr.ValidationType = ValidationType.XDR
[C#]
vr.ValidationType = ValidationType.Schema;
vr.ValidationType = ValidationType.XDR;
参照
スキーマとの XML の検証 | XmlValidatingReader.SchemaType プロパティ | XmlValidatingReader.ReadTypedValue メソッド