Aracılığıyla paylaş


XPathNavigator Kullanarak Kesin Türde XML Verilerine Erişme

XPath 2.0 veri modelinin bir örneği olarak, XPathNavigator sınıfı ortak dil çalışma zamanı (CLR) türlerine eşlenen kesin olarak belirlenmiş veriler içerebilir. XPath 2.0 veri modeline göre, yalnızca öğeler ve öznitelikler kesin olarak yazılan veriler içerebilir. sınıfı, XPathNavigator bir XPathDocument veya XmlDocument nesnesi içindeki verilere erişmek için kesin olarak yazılan veriler gibi mekanizmalar ve bir veri türünden diğerine dönüştürme mekanizmaları sağlar.

XPathNavigator Tarafından Kullanıma Sunulan Tür Bilgileri

XML 1.0 verileri, DTD, XML şema tanım dili (XSD) şeması veya başka bir mekanizmayla işlenmediği sürece teknik olarak türsüzdür. Xml öğesi veya özniteliğiyle ilişkilendirilebilen bir dizi tür bilgisi kategorisi vardır.

  • Basit CLR Türleri: XML Şema dillerinden hiçbiri Ortak Dil Çalışma Zamanı (CLR) türlerini doğrudan desteklemez. Basit öğe ve öznitelik içeriğini en uygun CLR türü olarak görüntüleyebilmek faydalı olduğundan, tüm basit içerik, şema bilgileri yokluğunda String olarak tanımlanabilir ve eklenmiş olan şema bilgileriyle daha uygun bir türe dönüştürülebilir. özelliğini kullanarak ValueType basit öğenin ve öznitelik içeriğinin en iyi eşleşen CLR türünü bulabilirsiniz. Şema yerleşik türlerinden CLR türlerine eşleme hakkında daha fazla bilgi için bkz. System.Xml Sınıflarında Tür Desteği.

  • Basit (CLR) Türlerinin Listeleri: Basit içeriğe sahip bir öğe veya öznitelik, boşlukla ayrılmış değerlerin listesini içerebilir. Değerler bir XML Şeması tarafından "liste türü" olarak belirtilir. XML Şeması olmadığında, bu tür basit içerik tek bir metin düğümü olarak değerlendirilir. Bir XML Şeması kullanılabilir olduğunda, bu basit içerik her biri clr nesneleri koleksiyonuna eşlenen basit bir türe sahip bir dizi atomik değer olarak gösterilebilir. Şema yerleşik türlerinden CLR türlerine eşleme hakkında daha fazla bilgi için bkz. System.Xml Sınıflarında Tür Desteği.

  • Yazılmış Değer: Basit türe sahip bir şema ile doğrulanmış bir öznitelik veya öğe, türlendirilmiş bir değere sahiptir. Bu değer sayısal, dize veya tarih türü gibi ilkel bir türdür. XSD'deki tüm dahili basit türler, bir düğümün değerine String olarak değil, daha uygun bir tür olarak erişim sağlayan CLR türleriyle eşlenebilir. Öznitelikleri olan veya alt öğeleri bulunan bir öğe, karmaşık bir tür olarak kabul edilir. Basit içeriğe sahip karmaşık bir türün (yalnızca alt öğe olarak metin düğümleri) yazılan değeri, içeriğinin basit türüyle aynıdır. Karmaşık içeriğe sahip karmaşık bir türün (bir veya daha fazla alt öğe) yazılı değeri, tüm alt metin düğümlerinin birleştirilmiş dize değeri olarak String döndürüldüğünde ortaya çıkan değerdir. Şema yerleşik türlerinden CLR türlerine eşleme hakkında daha fazla bilgi için bkz. System.Xml Sınıflarında Tür Desteği.

  • Schema-Language Belirli Tür Adı: Çoğu durumda, dış şema uygulamanın yan etkisi olarak ayarlanan CLR türleri, düğümün değerine erişim sağlamak için kullanılır. Ancak, bir XML belgesine uygulanan belirli bir şemayla ilişkili türü incelemek isteyebileceğiniz durumlar olabilir. Örneğin, ekli şemaya göre "PurchaseOrder" türünde içeriğe sahip olduğu belirlenen tüm öğeleri ayıklayarak bir XML belgesinde arama yapmak isteyebilirsiniz. Bu tür bilgiler yalnızca şema doğrulamasının bir sonucu olarak ayarlanabilir ve bu bilgilere sınıfın XmlType ve SchemaInfo özellikleri XPathNavigator aracılığıyla erişilir. Daha fazla bilgi için aşağıdaki Şema Doğrulama Bilgi Kümesi Sonrası (PSVI) bölümüne bakın.

  • Schema-Language Belirli Tür Yansıması: Diğer durumlarda, xml belgesine uygulanan şemaya özgü türün daha fazla ayrıntısını almak isteyebilirsiniz. Örneğin, bir XML dosyasını okurken, bazı özel hesaplamalar yapmak için XML belgesindeki her geçerli düğümün özniteliğini ayıklamak maxOccurs isteyebilirsiniz. Bu bilgiler yalnızca şema doğrulaması aracılığıyla ayarlandığından, sınıfın SchemaInfoXPathNavigator özelliği aracılığıyla erişilir. Daha fazla bilgi için aşağıdaki Şema Doğrulama Bilgi Kümesi Sonrası (PSVI) bölümüne bakın.

XPathNavigator Tipli Erişimciler

Aşağıdaki tabloda, bir düğüm hakkındaki tür bilgilerine erişmek için kullanılabilecek sınıfın çeşitli özellikleri ve yöntemleri XPathNavigator gösterilmektedir.

Mülkiyet Açıklama
XmlType Bu, geçerliyse düğümün XML şema türü bilgilerini içerir.
SchemaInfo Bu, doğrulamadan sonra eklenen düğümün Şema Sonrası Doğrulama Bilgi Kümesini içerir. Buna XML şema türü bilgilerinin yanı sıra geçerlilik bilgileri dahildir.
ValueType Düğümün belirtilen değeri için CLR türü.
TypedValue Düğümün içeriği, türü düğümün XML şema türüne en yakın olan bir veya daha fazla CLR değeridir.
ValueAsBoolean XPath 2.0 atama kurallarına göre, String de bir Boolean değeriyle uyumlu olacak şekilde xs:boolean geçerli düğümün değerine yayınlandı.
ValueAsDateTime XPath 2.0 atama kurallarına göre, String de bir DateTime değeriyle uyumlu olacak şekilde xs:datetime geçerli düğümün değerine yayınlandı.
ValueAsDouble XPath 2.0 atama kurallarına göre, String de bir Double değeriyle uyumlu olacak şekilde xsd:double geçerli düğümün değerine yayınlandı.
ValueAsInt XPath 2.0 atama kurallarına göre, String de bir Int32 değeriyle uyumlu olacak şekilde xs:integer geçerli düğümün değerine yayınlandı.
ValueAsLong XPath 2.0 atama kurallarına göre, String de bir Int64 değeriyle uyumlu olacak şekilde xs:integer geçerli düğümün değerine yayınlandı.
ValueAs Düğümün içeriği, XPath 2.0 dönüştürme kurallarına göre hedef türe dönüştürülür.

Şema yerleşik türlerinden CLR türlerine eşleme hakkında daha fazla bilgi için bkz. System.Xml Sınıflarında Tür Desteği.

Şema Sonrası Doğrulama Bilgi Kümesi (PSVI)

XML Şeması işlemcisi giriş olarak bir XML Infoset'i kabul eder ve bunu Şema Sonrası Doğrulama Bilgi Kümesine (PSVI) dönüştürür. PSVI, yeni bilgi öğelerinin eklendiği ve yeni özelliklerin mevcut bilgi öğelerine eklendiği özgün giriş XML bilgi kümesidir. PSVI'de XML Bilgi Setine eklenen ve XPathNavigator tarafından erişime açılan üç geniş bilgi sınıfı vardır.

  1. Doğrulama Sonuçları: Bir öğenin veya özniteliğin başarıyla doğrulanıp doğrulanmadığına ilişkin bilgiler. Bu, Validity sınıfının SchemaInfo özelliği tarafından XPathNavigator kullanıma sunulur.

  2. Varsayılan Bilgi: Öğenin veya özniteliğin değerinin şemada belirtilen varsayılan değerler aracılığıyla alınıp alınmadığını gösterir. Bu, IsDefault sınıfının SchemaInfo özelliği tarafından XPathNavigator kullanıma sunulur.

  3. Tür Ek Açıklamaları: Tür tanımları veya öğe ve öznitelik bildirimleri olabilecek şema bileşenlerine başvurular. XmlType özelliğiXPathNavigator, geçerliyse düğümün belirli tür bilgilerini içerir. Bir düğümün geçerliliği bilinmiyorsa, örneğin doğrulandıktan sonra düzenlendiyse. XmlType özelliği null olarak ayarlanır, ancak tür bilgileri SchemaInfo sınıfının XPathNavigator özelliğinin çeşitli özelliklerinden hala kullanılabilir.

Aşağıdaki örnek, XPathNavigator tarafından kullanıma sunulan Şema Sonrası Doğrulama Bilgi Kümesindeki bilgilerin nasıl kullanıldığını göstermektedir.

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

Örnek, dosyayı giriş olarak alır books.xml .

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

Örnek ayrıca şemayı books.xsd giriş olarak alır.

<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 Özelliklerini Kullanarak Yazılan Değerleri Alma

Bir düğümün yazılan değeri, TypedValue özelliğine XPathNavigator erişilerek alınabilir. Belirli durumlarda, bir düğümün girilen değerini farklı bir türe dönüştürmek isteyebilirsiniz. Bir XML düğümünden sayısal değer almak yaygın bir örnektir. Örneğin, aşağıdaki doğrulanmamış ve tiplenmemiş XML belgesini göz önünde bulundurun.

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

Eğer XPathNavigator öğesi price öğesi üzerine konumlandırıldıysa, XmlType özelliği null, ValueType özelliği String ve TypedValue özelliği dizesi 10.00 olur.

Ancak, , , ValueAsValueAsDoubleveya ValueAsInt yöntemini ve özelliklerini kullanarak ValueAsLongdeğeri sayısal bir değer olarak ayıklamak yine de mümkündür. ValueAs yöntemi kullanılarak böyle bir atama gerçekleştirilmesinin nasıl yapıldığını aşağıdaki örnek açıklar.

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

Şema yerleşik türlerinden CLR türlerine eşleme hakkında daha fazla bilgi için bkz. System.Xml Sınıflarında Tür Desteği.

Ayrıca bakınız