次の方法で共有


XPathNavigator を使用した厳密に型指定された XML データへのアクセス

XPath 2.0 データ モデルのインスタンスとして、 XPathNavigator クラスには、共通言語ランタイム (CLR) 型にマップされる厳密に型指定されたデータを含めることができます。 XPath 2.0 データ モデルによると、要素と属性にのみ厳密に型指定されたデータを含めることができます。 XPathNavigator クラスは、厳密に型指定されたデータとしてXPathDocumentまたはXmlDocument オブジェクト内のデータにアクセスするためのメカニズムと、あるデータ型から別のデータ型に変換するためのメカニズムを提供します。

XPathNavigator によって公開される型情報

XML 1.0 データは、DTD、XML スキーマ定義言語 (XSD) スキーマ、またはその他のメカニズムで処理されない限り、技術的には型がありません。 XML 要素または属性に関連付けることができる型情報には、さまざまなカテゴリがあります。

  • 単純な CLR 型: 共通言語ランタイム (CLR) 型を直接サポートする XML スキーマ言語はありません。 単純な要素と属性のコンテンツを最も適切な CLR 型として表示できると便利であるため、スキーマ情報が追加されていない場合は、すべての単純なコンテンツを String として入力できます。スキーマ情報を追加すると、このコンテンツがより適切な型に絞り込まれる可能性があります。 ValueType プロパティを使用して、最も一致する CLR 型の単純な要素と属性のコンテンツを見つけることができます。 スキーマの組み込み型から CLR 型へのマッピングの詳細については、「 System.Xml クラスでの型のサポート」を参照してください。

  • Simple (CLR) 型のリスト: 単純なコンテンツを含む要素または属性には、空白で区切られた値のリストを含めることができます。 値は、XML スキーマで "リスト型" として指定されます。XML スキーマがない場合、このような単純なコンテンツは 1 つのテキスト ノードとして扱われます。 XML スキーマを使用できる場合、この単純なコンテンツは、CLR オブジェクトのコレクションにマップされる単純型を持つ一連のアトミック値として公開できます。 スキーマの組み込み型から CLR 型へのマッピングの詳細については、「 System.Xml クラスでの型のサポート」を参照してください。

  • 型指定された値: 単純型を持つスキーマ検証済みの属性または要素には、型指定された値があります。 この値は、数値、文字列、日付型などのプリミティブ型です。 XSD 内のすべての組み込みの単純型は、 Stringとしてではなく、より適切な型としてノードの値へのアクセスを提供する CLR 型にマップできます。 属性や子要素を持つ要素は複合型と考えられます。 単純なコンテンツ (子としてのテキスト ノードのみ) を持つ複合型の型指定された値は、そのコンテンツの単純型の値と同じです。 複合コンテンツ (1 つ以上の子要素) を持つ複合型の型指定された値は、 Stringとして返されるすべての子テキスト ノードの連結の文字列値です。 スキーマの組み込み型から CLR 型へのマッピングの詳細については、「 System.Xml クラスでの型のサポート」を参照してください。

  • Schema-Language 特定の型名: ほとんどの場合、外部スキーマの適用の副作用として設定される CLR 型は、ノードの値へのアクセスを提供するために使用されます。 ただし、XML ドキュメントに適用される特定のスキーマに関連付けられている型を調べることが必要になる場合があります。 たとえば、XML ドキュメントを検索し、添付スキーマに従って "PurchaseOrder" 型のコンテンツがあると判断されたすべての要素を抽出することができます。 このような型情報は、スキーマ検証の結果としてのみ設定でき、この情報は、XmlType クラスのSchemaInfoおよびXPathNavigatorプロパティを介してアクセスされます。 詳細については、以下の「スキーマ検証後情報セット (PSVI)」セクションを参照してください。

  • スキーマ言語固有の型のリフレクション : また、XML ドキュメントに適用されたスキーマ固有の型の詳細をさらに取得する必要が生じる場合があります。 たとえば、XML ファイルを読み取るときに、カスタム計算を実行するために、XML ドキュメント内の有効な各ノードの maxOccurs 属性を抽出できます。 この情報はスキーマ検証によってのみ設定されるため、SchemaInfo クラスの XPathNavigator プロパティを介してアクセスされます。 詳細については、以下の「スキーマ検証後情報セット (PSVI)」セクションを参照してください。

XPathNavigator の型指定されたアクセサー

次の表に、ノードに関する型情報にアクセスするために使用できる XPathNavigator クラスのさまざまなプロパティとメソッドを示します。

プロパティ 説明
XmlType これには、ノードが有効な場合の XML スキーマ型情報が含まれます。
SchemaInfo これには、検証後に追加されるノードのスキーマ検証後の情報セットが含まれます。 これには、XML スキーマの種類の情報と、有効性の情報が含まれます。
ValueType ノードの型指定された値の CLR 型。
TypedValue ノードの XML スキーマ型に最も近い型を持つ 1 つ以上の CLR 値としてのノードの内容。
ValueAsBoolean Stringの XPath 2.0 キャスト規則に従って、現在のノードのBoolean値をxs:boolean値にキャストします。
ValueAsDateTime Stringの XPath 2.0 キャスト規則に従って、現在のノードのDateTime値をxs:datetime値にキャストします。
ValueAsDouble Stringの XPath 2.0 キャスト規則に従って、現在のノードのDouble値をxsd:double値にキャストします。
ValueAsInt Stringの XPath 2.0 キャスト規則に従って、現在のノードのInt32値をxs:integer値にキャストします。
ValueAsLong Stringの XPath 2.0 キャスト規則に従って、現在のノードのInt64値をxs:integer値にキャストします。
ValueAs XPath 2.0 キャスト規則に従ってターゲットの種類にキャストされるノードの内容。

スキーマの組み込み型から CLR 型へのマッピングの詳細については、「 System.Xml クラスでの型のサポート」を参照してください。

スキーマ検証後の情報セット (PSVI)

XML スキーマ プロセッサは、XML Infoset を入力として受け入れ、それをポスト スキーマ検証情報セット (PSVI) に変換します。 PSVI は、新しい情報項目が追加され、既存の情報項目に新しいプロパティが追加された元の入力 XML 情報セットです。 PSVI の XML Infoset に追加される情報には、 XPathNavigatorによって公開される 3 つの広範なクラスがあります。

  1. 検証結果: 要素または属性が正常に検証されたかどうかに関する情報。 これは、Validity クラスの SchemaInfo プロパティのXPathNavigator プロパティによって公開されます。

  2. 既定の情報: 要素または属性の値がスキーマで指定された既定値を使用して取得されたかどうかを示します。 これは、IsDefault クラスの SchemaInfo プロパティのXPathNavigator プロパティによって公開されます。

  3. 型注釈: 型定義または要素および属性宣言である可能性があるスキーマ コンポーネントへの参照。 XmlTypeXPathNavigator プロパティには、ノードが有効な場合は、そのノードの特定の型情報が含まれます。 検証された時点など、ノードの有効性が不明な場合は、その後編集されます。 その後、XmlType プロパティは null に設定されますが、型情報は、SchemaInfo クラスの XPathNavigator プロパティのさまざまなプロパティから引き続き使用できます。

次の例は、 XPathNavigatorによって公開されるスキーマ検証後の情報セットの情報を使用する方法を示しています。

Dim settings As XmlReaderSettings = New XmlReaderSettings()  
settings.Schemas.Add("http://www.contoso.com/books", "books.xsd")  
settings.ValidationType = ValidationType.Schema  
  
Dim reader As XmlReader = XmlReader.Create("books.xml", settings)  
  
Dim document As XmlDocument = New XmlDocument()  
document.Load(reader)  
Dim navigator As XPathNavigator = document.CreateNavigator()  
navigator.MoveToChild("books", "http://www.contoso.com/books")  
navigator.MoveToChild("book", "http://www.contoso.com/books")  
navigator.MoveToChild("published", "http://www.contoso.com/books")  
  
Console.WriteLine(navigator.SchemaInfo.SchemaType.Name)  
Console.WriteLine(navigator.SchemaInfo.Validity)  
Console.WriteLine(navigator.SchemaInfo.SchemaElement.MinOccurs)  
XmlReaderSettings settings = new XmlReaderSettings();  
settings.Schemas.Add("http://www.contoso.com/books", "books.xsd");  
settings.ValidationType = ValidationType.Schema;  
  
XmlReader reader = XmlReader.Create("books.xml", settings);  
  
XmlDocument document = new XmlDocument();  
document.Load(reader);  
XPathNavigator navigator = document.CreateNavigator();  
navigator.MoveToChild("books", "http://www.contoso.com/books");  
navigator.MoveToChild("book", "http://www.contoso.com/books");  
navigator.MoveToChild("published", "http://www.contoso.com/books");  
  
Console.WriteLine(navigator.SchemaInfo.SchemaType.Name);  
Console.WriteLine(navigator.SchemaInfo.Validity);  
Console.WriteLine(navigator.SchemaInfo.SchemaElement.MinOccurs);  

この例では、books.xml ファイルを入力として受け取ります。

<books xmlns="http://www.contoso.com/books">  
    <book>  
        <title>Title</title>  
        <price>10.00</price>  
        <published>2003-12-31</published>  
    </book>  
</books>  

この例では、 books.xsd スキーマも入力として受け取ります。

<xs:schema xmlns="http://www.contoso.com/books"
attributeFormDefault="unqualified" elementFormDefault="qualified"
targetNamespace="http://www.contoso.com/books"
xmlns:xs="http://www.w3.org/2001/XMLSchema">  
    <xs:simpleType name="publishedType">  
        <xs:restriction base="xs:date">  
            <xs:minInclusive value="2003-01-01" />  
            <xs:maxInclusive value="2003-12-31" />  
        </xs:restriction>  
    </xs:simpleType>  
    <xs:complexType name="bookType">  
        <xs:sequence>  
            <xs:element name="title" type="xs:string"/>  
            <xs:element name="price" type="xs:decimal"/>  
            <xs:element name="published" type="publishedType"/>  
        </xs:sequence>  
    </xs:complexType>  
    <xs:complexType name="booksType">  
        <xs:sequence>  
            <xs:element name="book" type="bookType" />  
        </xs:sequence>  
    </xs:complexType>  
    <xs:element name="books" type="booksType" />  
</xs:schema>  

ValueAs プロパティを使用して型指定された値を取得する

ノードの型指定された値は、TypedValueXPathNavigator プロパティにアクセスすることで取得できます。 場合によっては、ノードの型指定された値を別の型に変換することが必要になる場合があります。 一般的な例として、XML ノードから数値を取得します。 たとえば、次の未検証の XML ドキュメントと型指定されていない XML ドキュメントを考えてみます。

<books>  
    <book>  
        <title>Title</title>  
        <price>10.00</price>  
        <published>2003-12-31</published>  
    </book>  
</books>  

XPathNavigatorprice要素に配置されている場合、XmlType プロパティはnullValueType プロパティはStringされ、TypedValue プロパティは文字列10.00になります。

ただし、 ValueAsValueAsDoubleValueAsInt、または ValueAsLong メソッドとプロパティを使用して、値を数値として抽出することはできます。 次の例は、 ValueAs メソッドを使用してこのようなキャストを実行する方法を示しています。

Dim document As New XmlDocument()  
document.Load("books.xml")  
Dim navigator As XPathNavigator = document.CreateNavigator()  
navigator.MoveToChild("books", "")  
navigator.MoveToChild("book", "")  
navigator.MoveToChild("price", "")  
  
Dim price = navigator.ValueAs(GetType(Decimal))  
Dim discount As Decimal = 0.2  
  
Console.WriteLine("The price of the book has been dropped 20% from {0:C} to {1:C}", navigator.Value, (price - price * discount))  
XmlDocument document = new XmlDocument();  
document.Load("books.xml");  
XPathNavigator navigator = document.CreateNavigator();  
navigator.MoveToChild("books", "");  
navigator.MoveToChild("book", "");  
navigator.MoveToChild("price", "");  
  
Decimal price = (decimal)navigator.ValueAs(typeof(decimal));  
  
Console.WriteLine("The price of the book has been dropped 20% from {0:C} to {1:C}", navigator.Value, (price - price * (decimal)0.20));  

スキーマの組み込み型から CLR 型へのマッピングの詳細については、「 System.Xml クラスでの型のサポート」を参照してください。

こちらも参照ください