スキーマ型情報へのアクセス

スキーマ型情報にアクセスするには、SchemaType プロパティを使用します。SchemaType プロパティは、値が組み込みの XML スキーマ定義言語 (XSD) 型と、ユーザー定義の型 (simpleTypecomplexType など) のいずれであるかに応じて、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 メソッド