Přístup k datům XML silného typu pomocí XPathNavigator

Jako instance datového modelu XPath 2.0 může třída XPathNavigator obsahovat silně typová data, která se mapují na typy CLR (běhové prostředí pro běžné jazyky). Podle datového modelu XPath 2.0 mohou pouze prvky a atributy obsahovat silně typizovaná data. XPathNavigator třída poskytuje mechanismy pro přístup k datům v rámci objektu XPathDocument nebo XmlDocument jako silně typovaná data a také mechanismy pro převod z jednoho datového typu na jiný.

Informace o typech vystavené aplikací XPathNavigator

Data XML 1.0 jsou technicky bez typu, pokud nejsou zpracována pomocí schématu DTD, jazyka XSD (Xml Schema Definition Language) nebo jiného mechanismu. Existuje řada kategorií informací o typu, které lze přidružit k elementu NEBO atributu XML.

  • Jednoduché typy CLR: Žádné jazyky schématu XML nepodporují přímo typy CLR (Common Language Runtime). Vzhledem k tomu, že je užitečné zobrazit jednoduchý obsah elementu a atributu jako nejvhodnější typ CLR, může být veškerý jednoduchý obsah zadán jako String v případě, že chybí informace o schématu s veškerými informacemi o přidaném schématu, které by potenciálně upřesnily tento obsah na vhodnější typ. Nejlepší odpovídající typ CLR jednoduchého elementu a obsahu atributu ValueType najdete pomocí vlastnosti. Další informace o mapování z předdefinovaných typů schématu na typy CLR naleznete v tématu Podpora typů v třídy System.Xml.

  • Seznamy jednoduchých typů (CLR): Prvek nebo atribut s jednoduchým obsahem může obsahovat seznam hodnot oddělených prázdným znakem. Hodnoty jsou určeny schématem XML jako "typ seznamu". V případě absence schématu XML by takový jednoduchý obsah byl považován za jeden textový uzel. Pokud je k dispozici schéma XML, může být tento jednoduchý obsah zpřístupněn jako řada atomických hodnot, každý má jednoduchý typ, který se mapuje na kolekci objektů CLR. Další informace o mapování z předdefinovaných typů schématu na typy CLR naleznete v tématu Podpora typů v třídy System.Xml.

  • Typová hodnota: Atribut nebo prvek ověřený schématem s jednoduchým typem má zadaná hodnota. Tato hodnota je primitivní typ, například číselný, řetězcový nebo datový typ. Všechny vestavěné jednoduché typy v XSD lze mapovat na typy CLR, které poskytují přístup k hodnotě uzlu jako vhodnější typ, místo pouze jako typ String. Prvek s atributy nebo podřízenými elementy je považován za komplexní typ. Zadaná hodnota komplexního typu s jednoduchým obsahem (pouze textové uzly jako podřízené položky) je stejná jako u jednoduchého typu jeho obsahu. Zadaná hodnota komplexního typu se složitým obsahem (jeden nebo více podřízených prvků) je řetězcová hodnota zřetězení všech podřízených textových uzlů vrácených jako String. Další informace o mapování z předdefinovaných typů schématu na typy CLR naleznete v tématu Podpora typů v třídy System.Xml.

  • Schema-Language Název konkrétního typu: Ve většině případů se k zajištění přístupu k hodnotě uzlu používají typy CLR, které jsou nastavené jako vedlejší účinek použití externího schématu. Mohou však nastat situace, kdy můžete chtít prozkoumat typ přidružený ke konkrétnímu schématu použitému v dokumentu XML. Můžete například chtít prohledat dokument XML a extrahovat všechny prvky, které jsou určeny, aby měly obsah typu PurchaseOrder podle připojeného schématu. Takové informace o typu lze nastavit pouze v důsledku ověření schématu a tyto informace jsou přístupné prostřednictvím XmlType a SchemaInfo vlastností XPathNavigator třídy. Další informace naleznete v části PsVI (Post Schema Validation Infoset) níže.

  • Schema-Language Reflexe konkrétního typu: V jiných případech můžete chtít získat další podrobnosti o konkrétním typu, který je specifický pro schéma a použitý v dokumentu XML. Například při čtení souboru XML můžete chtít extrahovat maxOccurs atribut pro každý platný uzel v dokumentu XML, aby bylo možné provést nějaký vlastní výpočet. Vzhledem k tomu, že tyto informace jsou nastaveny pouze prostřednictvím ověřování schématu, k těmto informacím se přistupuje prostřednictvím vlastnosti SchemaInfo třídy XPathNavigator. Další informace naleznete v části PsVI (Post Schema Validation Infoset) níže.

Přístupové objekty typu XPathNavigator

Následující tabulka ukazuje různé vlastnosti a metody XPathNavigator třídy, které lze použít pro přístup k informacím o typu uzlu.

Vlastnictví Popis
XmlType Obsahuje informace o typu schématu XML pro uzel, pokud je platný.
SchemaInfo Obsahuje infoset postranního ověření uzlu, který se přidá po ověření. To zahrnuje informace o typu schématu XML a také informace o platnosti.
ValueType Typ CLR pro typovou hodnotu uzlu.
TypedValue Obsah uzlu jako jedna nebo více hodnot CLR, jejichž typ je nejblíže typu schématu XML uzlu.
ValueAsBoolean Hodnota aktuálního uzlu přetypovaná na String hodnotu podle pravidel přetypování XPath 2.0 pro Boolean.
ValueAsDateTime Hodnota aktuálního uzlu přetypovaná na String hodnotu podle pravidel přetypování XPath 2.0 pro DateTime.
ValueAsDouble Hodnota aktuálního uzlu přetypovaná na String hodnotu podle pravidel přetypování XPath 2.0 pro Double.
ValueAsInt Hodnota aktuálního uzlu přetypovaná na String hodnotu podle pravidel přetypování XPath 2.0 pro Int32.
ValueAsLong Hodnota aktuálního uzlu přetypovaná na String hodnotu podle pravidel přetypování XPath 2.0 pro Int64.
ValueAs Obsah uzlu je přetypován na cílový typ podle pravidel přetypování XPath 2.0.

Další informace o mapování z předdefinovaných typů schématu na typy CLR naleznete v tématu Podpora typů v třídy System.Xml.

Sada informací po ověření schématu (PSVI)

Procesor schématu XML přijímá jako vstup xml infoset a převede ho na sadu informací PSVI (Post Schema Validation Infoset). PsVI je původní vstupní informační sada XML s novými položkami informací přidanými a novými vlastnostmi přidanými do existujících položek informací. Existují tři hlavní kategorie informací přidané do XML Infosetu v PSVI, které se zobrazují prostřednictvím XPathNavigator.

  1. Ověřovací výsledky: Informace o tom, zda byl prvek nebo atribut úspěšně ověřen nebo ne. Toto je zpřístupněno vlastností Validity vlastnosti SchemaInfo třídy XPathNavigator.

  2. Výchozí informace: Indikace toho, zda hodnota prvku nebo atributu byla získána prostřednictvím výchozích hodnot zadaných ve schématu nebo ne. Toto je zpřístupněno vlastností IsDefault vlastnosti SchemaInfo třídy XPathNavigator.

  3. Poznámky typu: Odkazy na součásti schématu, které mohou být definice typů nebo deklarace elementů a atributů. Vlastnost XmlTypeXPathNavigator obsahuje konkrétní informace o typu uzlu, pokud je platný. Pokud je platnost uzlu neznámá, například když byl nejprve ověřen a následně upraven. Pak je vlastnost XmlType nastavena na null, ale informace o typu jsou stále dostupné z různých vlastností SchemaInfo objektu třídy XPathNavigator.

Následující příklad ukazuje použití informací v Post Schema Validation Infoset odhalené 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);

Příklad přebírá books.xml soubor jako vstup.

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

Příklad také přebírá books.xsd schéma jako vstup.

<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>

Získání zadaných hodnot pomocí vlastností ValueAs

Typovou hodnotu uzlu lze načíst přístupem k TypedValue vlastnosti objektu XPathNavigator. V některých případech můžete chtít převést typovou hodnotu uzlu na jiný typ. Běžným příkladem je získání číselné hodnoty z uzlu XML. Představte si například následující neplatný a netypovaný dokument XML.

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

Pokud je XPathNavigator umístěna na prvku price, vlastnost XmlType by byla null, vlastnost ValueType by byla String, a vlastnost TypedValue by byla řetězec 10.00.

Přesto je však možné extrahovat hodnotu jako číselnou hodnotu pomocí ValueAsmetody , ValueAsDoubleValueAsIntnebo ValueAsLong metody a vlastností. Ukázka znázorňuje, jak pomocí metody ValueAs provést takové přetypování.

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));

Další informace o mapování z předdefinovaných typů schématu na typy CLR naleznete v tématu Podpora typů v třídy System.Xml.

Viz také