Bagikan melalui


Menggunakan XPathNavigator untuk Mengakses Data XML Bertipe Kuat

Sebagai instans model data XPath 2.0, kelas XPathNavigator dapat berisi data yang bertipe kuat yang memetakan ke jenis runtime bahasa umum (CLR). Menurut model data XPath 2.0, hanya elemen dan atribut yang dapat berisi data bertipe kuat. Kelas XPathNavigator menyediakan mekanisme untuk mengakses data dalam objek XPathDocument atau XmlDocument sebagai data bertipe kuat, serta mekanisme untuk mengonversi dari satu tipe data ke tipe data lainnya.

Jenis Informasi yang Diekspos oleh XPathNavigator

Data XML 1.0 secara teknis tanpa jenis, kecuali diproses dengan skema DTD, bahasa definisi skema XML (XSD), atau mekanisme lainnya. Ada sejumlah kategori informasi jenis yang dapat dikaitkan dengan elemen atau atribut XML.

  • Jenis CLR Sederhana: Tidak ada bahasa Skema XML yang mendukung jenis Common Language Runtime (CLR) secara langsung. Karena berguna untuk dapat melihat elemen sederhana dan konten atribut sebagai jenis CLR yang paling tepat, semua konten sederhana dapat diketik sebagai String ketika tidak ada informasi skema, dengan informasi skema tambahan yang berpotensi menyempurnakan konten ini menjadi jenis yang lebih tepat. Anda dapat menemukan jenis CLR yang paling cocok dari elemen sederhana dan konten atribut dengan menggunakan properti ValueType. Untuk informasi selengkapnya tentang pemetaan dari jenis bawaan skema ke jenis CLR, lihat Jenis Dukungan di Kelas System.Xml.

  • Daftar Jenis Sederhana (CLR): Elemen atau atribut dengan konten sederhana dapat berisi daftar nilai yang dipisahkan oleh spasi kosong. Nilai ditentukan oleh Skema XML untuk menjadi "jenis daftar." Dengan tidak adanya Skema XML, konten sederhana tersebut akan diperlakukan sebagai simpul teks tunggal. Ketika Skema XML tersedia, konten sederhana ini bisa ditampilkan sebagai serangkaian nilai atomik, masing-masing memiliki jenis sederhana yang memetakan ke kumpulan objek CLR. Untuk informasi selengkapnya tentang pemetaan dari jenis bawaan skema ke jenis CLR, lihat Jenis Dukungan di Kelas System.Xml.

  • Nilai yang Diketik: Atribut atau elemen yang divalidasi skema dengan jenis sederhana memiliki nilai yang diketik. Nilai ini adalah jenis primitif seperti numerik, string, atau jenis tanggal. Semua jenis sederhana bawaan di XSD dapat dipetakan ke jenis CLR yang menyediakan akses ke nilai node sebagai jenis yang lebih tepat alih-alih hanya sebagai String. Elemen dengan atribut atau elemen turunan dianggap sebagai tipe kompleks. Nilai yang ditaip dari jenis kompleks dengan konten sederhana (hanya memiliki anak simpul teks) sama dengan jenis sederhana dari kontennya. Nilai yang diketik dari jenis kompleks dengan konten kompleks (satu atau beberapa elemen anak) adalah nilai string dari penggabungan semua simpul teks turunannya yang dikembalikan sebagai String. Untuk informasi selengkapnya tentang pemetaan dari jenis bawaan skema ke jenis CLR, lihat Jenis Dukungan di Kelas System.Xml.

  • Schema-Language Nama Jenis Spesifik: Dalam kebanyakan kasus, jenis CLR, yang ditetapkan sebagai hasil samping dari penerapan skema eksternal, digunakan untuk memungkinkan akses ke nilai simpul. Namun, mungkin ada situasi di mana Anda mungkin ingin memeriksa jenis yang terkait dengan skema tertentu yang diterapkan ke dokumen XML. Misalnya, Anda mungkin ingin mencari melalui dokumen XML, mengekstrak semua elemen yang ditentukan untuk memiliki konten jenis "PurchaseOrder" sesuai dengan skema terlampir. Informasi jenis tersebut hanya dapat ditetapkan setelah validasi skema, dan informasi ini diakses melalui properti XmlType dan SchemaInfo dari kelas XPathNavigator. Untuk informasi selengkapnya, lihat bagian Post Schema Validation Infoset (PSVI) di bawah ini.

  • Schema-Language Pembahasan Tipe Spesifik: Dalam kasus lain, Anda mungkin ingin mendapatkan detail lebih lanjut dari tipe khusus dari skema yang diterapkan ke dokumen XML. Misalnya, saat membaca file XML, Anda mungkin ingin mengekstrak maxOccurs atribut untuk setiap simpul yang valid dalam dokumen XML untuk melakukan beberapa perhitungan kustom. Karena informasi ini diatur hanya melalui validasi skema, informasi ini diakses melalui SchemaInfo properti XPathNavigator kelas . Untuk informasi selengkapnya, lihat bagian Post Schema Validation Infoset (PSVI) di bawah ini.

XPathNavigator Pengkases Berdasarkan Tipe

Tabel berikut ini memperlihatkan berbagai properti dan metode XPathNavigator kelas yang dapat digunakan untuk mengakses informasi jenis tentang simpul.

Harta benda Deskripsi
XmlType Ini berisi informasi jenis skema XML untuk simpul jika valid.
SchemaInfo Ini berisi Set Info Post-Validasi Skema dari simpul yang ditambahkan setelah validasi. Ini termasuk informasi jenis skema XML, serta informasi validitas.
ValueType Jenis CLR dari nilai yang ditik dari simpul.
TypedValue Konten simpul sebagai satu atau beberapa nilai CLR yang jenisnya paling cocok dengan jenis skema XML simpul.
ValueAsBoolean Nilai String dari simpul saat ini diubah menjadi nilai Boolean, sesuai dengan aturan pengubahan XPath 2.0 untuk xs:boolean.
ValueAsDateTime Nilai String dari simpul saat ini diubah menjadi nilai DateTime, sesuai dengan aturan pengubahan XPath 2.0 untuk xs:datetime.
ValueAsDouble Nilai String dari simpul saat ini diubah menjadi nilai Double, sesuai dengan aturan pengubahan XPath 2.0 untuk xsd:double.
ValueAsInt Nilai String dari simpul saat ini diubah menjadi nilai Int32, sesuai dengan aturan pengubahan XPath 2.0 untuk xs:integer.
ValueAsLong Nilai String dari simpul saat ini diubah menjadi nilai Int64, sesuai dengan aturan pengubahan XPath 2.0 untuk xs:integer.
ValueAs Konten node dikonversi ke tipe target sesuai dengan aturan konversi XPath 2.0.

Untuk informasi selengkapnya tentang pemetaan dari jenis bawaan skema ke jenis CLR, lihat Jenis Dukungan di Kelas System.Xml.

Post Schema Validation Infoset (PSVI)

Prosesor Skema XML menerima Infoset XML sebagai input dan mengonversinya menjadi Post Schema Validation Infoset (PSVI). PSVI adalah himpunan info XML input asli dengan item informasi baru yang ditambahkan dan properti baru ditambahkan ke item informasi yang sudah ada. Ada tiga kategori informasi utama yang ditambahkan ke XML Infoset dalam PSVI yang diekspos oleh XPathNavigator.

  1. Hasil Validasi: Informasi tentang apakah elemen atau atribut berhasil divalidasi atau tidak. Ini diekspos oleh properti Validity dari properti SchemaInfo dari kelas XPathNavigator.

  2. Informasi Default: Indikasi apakah nilai elemen atau atribut diperoleh melalui nilai default yang ditentukan dalam skema atau tidak. Ini diekspos oleh properti IsDefault dari properti SchemaInfo dari kelas XPathNavigator.

  3. Anotasi Tipe: Referensi ke komponen skema yang mungkin merupakan definisi tipe atau elemen dan deklarasi atribut. Properti XmlType dari XPathNavigator berisi informasi jenis khusus tentang simpul jika itu valid. Jika validitas simpul tidak diketahui, seperti setelah divalidasi kemudian diedit. XmlType properti kemudian diatur ke null tetapi informasi tipe masih tersedia dari berbagai properti dari properti SchemaInfo dari kelas XPathNavigator.

Contoh berikut mengilustrasikan penggunaan informasi dalam Post Schema Validation Infoset yang diekspos oleh 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);  

Contoh mengambil file books.xml sebagai input.

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

Contohnya juga mengambil books.xsd skema sebagai input.

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

Dapatkan Nilai Berdasarkan Tipe Menggunakan Properti ValueAs

Nilai tertulis dari sebuah node dapat diambil dengan mengakses properti TypedValue dari XPathNavigator. Dalam kasus tertentu, Anda mungkin ingin mengonversi nilai node yang ditik ke jenis yang berbeda. Contoh umumnya adalah mendapatkan nilai numerik dari simpul XML. Misalnya, pertimbangkan dokumen XML yang tidak divalidasi dan tidak bertipe berikut ini.

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

Jika XPathNavigator diposisikan pada elemen price, properti XmlType akan menjadi null, properti ValueType akan menjadi String, dan properti TypedValue akan menjadi string 10.00.

Namun, masih mungkin untuk mengekstrak nilai sebagai nilai numerik menggunakan metode ValueAs, ValueAsDouble, ValueAsInt, atau ValueAsLong dan properti. Contoh berikut mengilustrasikan cara melakukan konversi seperti itu menggunakan metode 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));  

Untuk informasi selengkapnya tentang pemetaan dari jenis bawaan skema ke jenis CLR, lihat Jenis Dukungan di Kelas System.Xml.

Lihat juga