Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Jika Anda menggunakan bagian pesan .Net, dimungkinkan untuk membuat anotasi kode Anda dengan atribut serialisasi XML yang, ketika juga disertai dengan bidang khusus dan/atau anotasi properti, dapat menghasilkan ekspresi XPath yang cukup kompleks. Ada kemungkinan bahwa ekspresi XPath yang kompleks ini akan menjadi non-kanonis. XPath non-kanonis hanya boleh digunakan dalam orkestrasi yang terikat langsung dan mungkin tidak berfungsi pada orkestrasi yang terikat secara logis atau fisik. Orkestrasi terikat langsung tidak bergantung pada alur untuk memproses dokumen XML; akibatnya, seluruh dokumen XML dimuat dalam memori sebelum diproses.
XPath Kanonis dan Non-Kanonis
Bentuk kanonis atau pendek XPath menggunakan sintaks yang disingkat dari spesifikasi XPath (http://www.w3.org/TR/xpath) untuk menentukan jalur lokasi. Beberapa properti membedakan ekspresi XPath kanonis meliputi:
Sumbu
child::diasumsikan secara default untuk setiap langkah ekspresi@adalah singkatan dariattribute::.//adalah singkatan dari/descendant-or-self::node()/..adalah singkatan dariself::node()...adalah singkatan dariparent::node().Ekspresi Canonical XPath adalah ekspresi sederhana seperti
/*[local-name()='element-name' and namespaceURI()='http://MyUri.org']/*[local-name()='element-name']/@*[local-name='attribute-name'].Ini dapat dikontraskan dengan bentuk XPath non-kanonis. Bentuk ini juga dikenal sebagai "bentuk umum" atau "XPath arbitrer" dan dibedakan oleh ekspresi yang semena-mena kompleks dan dapat menggabungkan beberapa sumbu:
//element-name//*[local-name()='element-name' and position()=2].
Contoh
Pertimbangkan program berikut:
using System;
using System.IO;
using System.Xml.Serialization;
using Microsoft.XLANGs.BaseTypes;
namespace ComplexNetXPath
{
public class Animal
{
[Property( typeof(BTS.RetryCount) )]
public int NumberOfLegs;
}
public class Snake : Animal
{
public Snake()
{
NumberOfLegs = 0;
}
}
public class Dog : Animal
{
public Dog()
{
NumberOfLegs = 4;
}
}
public class Zoo
{
//
// Dogs and snakes are the possible animals of
// the week.
//
[XmlElement(typeof(Snake))]
[XmlElement(typeof(Dog))]
public Animal AnimalOfTheWeek;
}
class Class1
{
static void Main(string[] args)
{
XmlSerializer ser = new XmlSerializer(typeof(Zoo));
Stream s = Console.OpenStandardOutput();
Zoo z = new Zoo();
z.AnimalOfTheWeek = new Dog();
ser.Serialize( s, z );
s.Flush();
Console.WriteLine("------------------");
z.AnimalOfTheWeek = new Snake();
ser.Serialize( s, z );
s.Flush();
}
}
}
Jenis Kebun Binatang berisi bidang Hewan yang mungkin berupa Ular atau Anjing. Instance Animal memiliki bidang NumberOfLegs yang dianotasi dengan PropertyAttribute yang menugaskan properti BTS.RetryCount ke bidang ini.
Nota
Aplikasi nyata akan menentukan propertinya sendiri.
Ketika hewan dalam seminggu adalah anjing, instans Kebun Binatang berseri terlihat seperti ini:
<Zoo>
<Dog>
<NumberOfLegs>4</NumberOfLegs>
</Dog>
</Zoo>
Ketika hewan minggu ini adalah ular, instans Kebun Binatang terseri terlihat seperti ini:
<Zoo>
<Snake>
<NumberOfLegs>0</NumberOfLegs>
</Snake>
</Zoo>
Dengan mempertimbangkan skema Xml yang setara dengan kelas .Net Zoo, ekspresi XPath untuk memilih properti RetryCount memungkinkan langkah menuju properti tersebut bisa mencakup elemen Snake atau Dog:
/*[local-name()='Zoo' and namespace-uri()='']/*[(local-name()='Dog' and namespace-uri()='') or (local-name()='Snake' and namespace-uri()='')]/*[local-name()='NumberOfLegs' and namespace-uri()='']
Komponen alur XML tidak dapat menangani ekspresi XPath non-kanonis ini. Untuk menghindari situasi ini, atribut serialisasi XML pilihan ganda tidak boleh digunakan bersama dengan alur pemrosesan XML, dan perhatian harus diberikan saat menggunakan atribut serialisasi XML berikut:
XmlElementAttribute
XmlAttributeAttribute
XmlArrayItemAttribute