Přístup k datům XML silného typu pomocí XPathNavigator
Jako instance datového modelu XPathNavigator XPath 2.0 může třída obsahovat data silného typu, která se mapuje na typy CLR (Common Language Runtime). Podle datového modelu XPath 2.0 můžou obsahovat pouze prvky a atributy se silnými typy dat. XPathNavigator Třída poskytuje mechanismy pro přístup k datům v rámci objektu XmlDocument jako data silného XPathDocument typu 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 předdefinované jednoduché typy V XSD lze mapovat na typy CLR, které poskytují přístup k hodnotě uzlu jako vhodnější typ místo jako Stringtyp . 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.
Název konkrétního typu jazyka schématu: Ve většině případů se typy CLR, které jsou nastavené jako vedlejší účinek použití externího schématu, používají k poskytnutí přístupu k hodnotě uzlu. 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.
Typ specifický pro jazyk schématu Reflexe ion: V jiných případech můžete chtít získat další podrobnosti o typu specifickém pro schéma 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, je přístup prostřednictvím SchemaInfo vlastnosti XPathNavigator třídy. 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.
Vlastnost | Popis |
---|---|
XmlType | Obsahuje informace o typu schématu XML pro uzel, pokud je platný. |
SchemaInfo | Obsahuje sadu informací o ověření po schématu uzlu, který se přidá po ověření. To zahrnuje informace o typu schématu XML a také informace o platnosti. |
ValueType | Typ CLR typové hodnoty uzlu. |
TypedValue | Obsah uzlu jako jedna nebo více hodnot CLR, jejichž typ je nejblíže typu schématu XML uzlu. |
ValueAsBoolean | String Hodnota aktuálního přetypování uzlu na Boolean hodnotu podle pravidel přetypování XPath 2.0 pro xs:boolean . |
ValueAsDateTime | String Hodnota aktuálního přetypování uzlu na DateTime hodnotu podle pravidel přetypování XPath 2.0 pro xs:datetime . |
ValueAsDouble | String Hodnota aktuálního přetypování uzlu na Double hodnotu podle pravidel přetypování XPath 2.0 pro xsd:double . |
ValueAsInt | String Hodnota aktuálního přetypování uzlu na Int32 hodnotu podle pravidel přetypování XPath 2.0 pro xs:integer . |
ValueAsLong | String Hodnota aktuálního přetypování uzlu na Int64 hodnotu podle pravidel přetypování XPath 2.0 pro xs:integer . |
ValueAs | Obsah přetypování uzlu 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í o ověření po 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 široké třídy informací přidané do XML Infoset v PSVI, které jsou vystaveny XPathNavigator.
Ověřovací výsledky: Informace o tom, zda byl prvek nebo atribut úspěšně ověřen nebo ne. Tato vlastnost je vystavena Validity vlastností SchemaInfo třídy XPathNavigator .
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. Tato vlastnost je vystavena IsDefault vlastností SchemaInfo třídy XPathNavigator .
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 při jeho ověření, pak se následně upravila. vlastnost je nastavena XmlType ,
null
ale typ informace jsou stále k dispozici z různých vlastností SchemaInfo vlastnosti XPathNavigator třídy.
Následující příklad ukazuje použití informací v Post Schema Validation Infoset vystavené 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 vezme 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 umístěna na prvku, vlastnost by byla null
, ValueType vlastnost by Stringa TypedValue vlastnost by byla řetězec 10.00
.XmlTypeprice
XPathNavigator
Přesto je však možné extrahovat hodnotu jako číselnou hodnotu pomocí ValueAsmetody , ValueAsDoubleValueAsIntnebo ValueAsLong metody a vlastností. Následující příklad znázorňuje provedení takového přetypování pomocí ValueAs metody.
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.