Uzyskiwanie dostępu do silnie typizowanych danych XML przy użyciu klasy XPathNavigator

Jako wystąpienie modelu XPathNavigator danych XPath 2.0 klasa może zawierać silnie typizowane dane mapowane na typy środowiska uruchomieniowego języka wspólnego (CLR). Zgodnie z modelem danych XPath 2.0 tylko elementy i atrybuty mogą zawierać silnie typizowane dane. Klasa XPathNavigator udostępnia mechanizmy uzyskiwania dostępu do danych w obiekcie XPathDocument lub XmlDocument jako silnie typizowane dane, a także mechanizmy konwersji z jednego typu danych na inny.

Informacje o typie uwidocznione przez XPathNavigator

Dane XML 1.0 są technicznie bez typu, chyba że są przetwarzane przy użyciu schematu DTD, języka definicji schematu XML (XSD) lub innego mechanizmu. Istnieje wiele kategorii informacji o typie, które mogą być skojarzone z elementem XML lub atrybutem.

  • Proste typy CLR: Żaden z języków schematu XML nie obsługuje bezpośrednio typów środowiska uruchomieniowego języka wspólnego (CLR). Ponieważ przydatne jest wyświetlanie prostej zawartości elementu i atrybutu jako najbardziej odpowiedniego typu CLR, można wpisać całą prostą zawartość, ponieważ String w przypadku braku informacji o schemacie z wszelkimi dodanymi informacjami o schemacie potencjalnie uściślić tę zawartość do bardziej odpowiedniego typu. Najlepiej pasujący typ CLR prostej zawartości elementu i atrybutu można znaleźć przy użyciu ValueType właściwości . Aby uzyskać więcej informacji na temat mapowania z wbudowanych typów schematu na typy CLR, zobacz Obsługa typów w klasach System.Xml.

  • Listy typów prostych (CLR): element lub atrybut z prostą zawartością może zawierać listę wartości rozdzielonych odstępami. Wartości są określane przez schemat XML jako "typ listy". W przypadku braku schematu XML taka prosta zawartość byłaby traktowana jako pojedynczy węzeł tekstowy. Gdy schemat XML jest dostępny, tę prostą zawartość można uwidocznić jako serię wartości niepodzielnych, z których każdy ma prosty typ mapowany na kolekcję obiektów CLR. Aby uzyskać więcej informacji na temat mapowania z wbudowanych typów schematu na typy CLR, zobacz Obsługa typów w klasach System.Xml.

  • Wartość typowana: atrybut lub element zweryfikowany schematem z prostym typem ma wartość typową. Ta wartość jest typem pierwotnym, takim jak numeryczny, ciąg lub typ daty. Wszystkie wbudowane proste typy W usłudze XSD można mapować na typy CLR, które zapewniają dostęp do wartości węzła jako bardziej odpowiedniego typu zamiast jako String. Element z atrybutami lub elementami podrzędnymi jest uważany za typ złożony. Typowa wartość typu złożonego z prostą zawartością (tylko węzły tekstowe jako elementy podrzędne) jest taka sama jak w przypadku prostego typu zawartości. Typowa wartość typu złożonego o złożonej zawartości (co najmniej jeden element podrzędny) jest wartością ciągu łączenia wszystkich podrzędnych węzłów tekstowych zwróconych jako String. Aby uzyskać więcej informacji na temat mapowania z wbudowanych typów schematu na typy CLR, zobacz Obsługa typów w klasach System.Xml.

  • Nazwa typu specyficznego dla języka schematu: w większości przypadków typy CLR, które są ustawiane jako efekt uboczny stosowania schematu zewnętrznego, są używane do zapewnienia dostępu do wartości węzła. Mogą jednak wystąpić sytuacje, w których warto zbadać typ skojarzony z określonym schematem zastosowanym do dokumentu XML. Na przykład możesz wyszukać dokument XML, wyodrębniając wszystkie elementy, które są określane jako zawartość typu "PurchaseOrder" zgodnie z dołączonym schematem. Takie informacje o typie można ustawić tylko w wyniku weryfikacji schematu, a te informacje są dostępne za pośrednictwem XmlType właściwości XPathNavigator i SchemaInfo klasy . Aby uzyskać więcej informacji, zobacz sekcję Infoset (PSVI) po weryfikacji schematu poniżej.

  • Typ specyficzny dla języka schematu Emocje ion: w innych przypadkach można uzyskać dalsze szczegóły typu specyficznego dla schematu zastosowanego do dokumentu XML. Na przykład podczas odczytywania pliku XML możesz wyodrębnić maxOccurs atrybut dla każdego prawidłowego węzła w dokumencie XML w celu wykonania pewnych obliczeń niestandardowych. Ponieważ te informacje są ustawiane tylko za pośrednictwem weryfikacji schematu, są dostępne za pośrednictwem SchemaInfo właściwości XPathNavigator klasy. Aby uzyskać więcej informacji, zobacz sekcję Infoset (PSVI) po weryfikacji schematu poniżej.

Metody dostępu typu XPathNavigator

W poniższej tabeli przedstawiono różne właściwości i metody XPathNavigator klasy, które mogą służyć do uzyskiwania dostępu do informacji o typie węzła.

Właściwości opis
XmlType Zawiera on informacje o typie schematu XML dla węzła, jeśli jest on prawidłowy.
SchemaInfo Zawiera on zestaw informacji po weryfikacji schematu węzła, który jest dodawany po weryfikacji. Obejmuje to informacje o typie schematu XML, a także informacje o ważności.
ValueType Typ CLR typu typizowanej wartości węzła.
TypedValue Zawartość węzła jako co najmniej jedna wartość CLR, której typ jest najbliżej typu schematu XML węzła.
ValueAsBoolean Wartość String bieżącego węzła rzutowania Boolean na wartość zgodnie z regułami rzutowania XPath 2.0 dla elementu xs:boolean.
ValueAsDateTime Wartość String bieżącego węzła rzutowania DateTime na wartość zgodnie z regułami rzutowania XPath 2.0 dla elementu xs:datetime.
ValueAsDouble Wartość String bieżącego węzła rzutowania Double na wartość zgodnie z regułami rzutowania XPath 2.0 dla elementu xsd:double.
ValueAsInt Wartość String bieżącego węzła rzutowania Int32 na wartość zgodnie z regułami rzutowania XPath 2.0 dla elementu xs:integer.
ValueAsLong Wartość String bieżącego węzła rzutowania Int64 na wartość zgodnie z regułami rzutowania XPath 2.0 dla elementu xs:integer.
ValueAs Zawartość węzła rzutowania na typ docelowy zgodnie z regułami rzutowania XPath 2.0.

Aby uzyskać więcej informacji na temat mapowania z wbudowanych typów schematu na typy CLR, zobacz Obsługa typów w klasach System.Xml.

Zestaw informacji po weryfikacji schematu (PSVI)

Procesor schematu XML akceptuje zestaw informacji XML jako dane wejściowe i konwertuje go na zestaw informacji weryfikacji schematu post (PSVI). PsVI to oryginalny wejściowy zestaw informacji XML z dodanymi nowymi elementami informacji i nowymi właściwościami dodanymi do istniejących elementów informacji. Istnieją trzy szerokie klasy informacji dodanych do zestawu informacji XML w programie PSVI, które są udostępniane przez program XPathNavigator.

  1. Wyniki walidacji: informacje o tym, czy element lub atrybut został pomyślnie zweryfikowany, czy nie. Jest to uwidocznione przez Validity właściwość SchemaInfo właściwości XPathNavigator klasy.

  2. Informacje domyślne: wskazuje, czy wartość elementu lub atrybutu została uzyskana za pośrednictwem wartości domyślnych określonych w schemacie, czy nie. Jest to uwidocznione przez IsDefault właściwość SchemaInfo właściwości XPathNavigator klasy.

  3. Adnotacje typu: odwołania do składników schematu, które mogą być definicjami typów lub deklaracjami elementów i atrybutów. Właściwość XmlType obiektu XPathNavigator zawiera informacje o określonym typie węzła, jeśli jest on prawidłowy. Jeśli ważność węzła jest nieznana, na przykład wtedy, gdy została zweryfikowana, następnie edytowana. następnie właściwość jest ustawiona XmlType na null , ale informacje o typie są nadal dostępne z różnych właściwości właściwości SchemaInfoXPathNavigator klasy.

Poniższy przykład ilustruje użycie informacji w zestawie informacji po weryfikacji schematu uwidocznionych przez element 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);  

W przykładzie plik jest pobierany books.xml jako dane wejściowe.

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

W przykładzie schemat jest również pobierany books.xsd jako dane wejściowe.

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

Uzyskiwanie wartości typowych przy użyciu właściwości ValueAs

Typizowane wartości węzła można pobrać, korzystając TypedValue z właściwości XPathNavigator. W niektórych przypadkach można przekonwertować typową wartość węzła na inny typ. Typowym przykładem jest pobranie wartości liczbowej z węzła XML. Rozważmy na przykład następujący nieprzetworzany i nietypowy dokument XML.

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

Jeśli właściwość XPathNavigator jest umieszczona na elemecie price , XmlType właściwość będzie nullStringmiała wartość , ValueType a TypedValue właściwość będzie ciągiem 10.00.

Jednak nadal można wyodrębnić wartość jako wartość liczbową przy użyciu ValueAswłaściwości , , ValueAsDoubleValueAsIntlub ValueAsLong i . Poniższy przykład ilustruje wykonanie takiego rzutowania ValueAs przy użyciu 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));  

Aby uzyskać więcej informacji na temat mapowania z wbudowanych typów schematu na typy CLR, zobacz Obsługa typów w klasach System.Xml.

Zobacz też