在訊息指派中使用非標準 XPath
如果您使用 .Net 訊息部分,您的程式碼可以使用 XML 序列化屬性加以附註,當伴隨著辨別欄位和/或屬性附註時,將產生相當複雜 XPath 運算式。 這些複雜的 XPath 運算式可能是非標準的運算式。 非標準 XPath 只能在直接繫結協調流程中使用,並且可能在邏輯或實際繫結協調流程中失敗。 直接繫結協調流程並不依賴管線來處理 XML 文件,因此整個 XML 文件會在處理之前載入記憶體。
標準和非標準 XPath
標準或簡短形式的 XPath 會使用 XPath 規格的縮寫語法, (http://www.w3.org/TR/xpath) 來指定位置路徑。 部分標準 XPath 運算式的辨別屬性如下:
child::
預設會針對運算式的每個步驟假設座標軸@
為 的attribute::
簡短 。//
為 的/descendant-or-self::node()/
簡短 。.
為 的self::node()
簡短 。..
為 的parent::node()
簡短 。標準 XPath 運算式是簡單的運算式,例如
/*[local-name()='element-name' and namespaceURI()='http://MyUri.org']/*[local-name()='element-name']/@*[local-name='attribute-name']
。您可以將此運算式對照 XPath 的非標準格式。 此表單也稱為「一般表單」或「任意 XPath」,而且會以任意複雜且可合併多個座標軸的運算式來區別:
//element-name//*[local-name()='element-name' and position()=2]
。
範例
請考慮下列程式:
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();
}
}
}
Zoo 類型包含 Animal 欄位,可能是 Snake 或 Dog。 Animal 執行個體具有由 PropertyAttribute 附註的 NumberOfLegs 欄位,而 PropertyAttribute 指派 BTS.RetryCount 屬性給此欄位。
注意
實際的應用程式將會定義其本身的屬性。
當每週的代表動物是狗時,序列化的 Zoo 執行個體會像這樣:
<Zoo>
<Dog>
<NumberOfLegs>4</NumberOfLegs>
</Dog>
</Zoo>
當每週的代表動物是蛇時,序列化的 Zoo 執行個體會像這樣:
<Zoo>
<Snake>
<NumberOfLegs>0</NumberOfLegs>
</Snake>
</Zoo>
因為 XML 結構描述等同 .Net Zoo 類別,用於選取 RetryCount 屬性的 XPath 運算式允許讓 Snake 或 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()='']
XML 管線元件無法處理這個非標準 XPath 運算式。 若要避免這種情況,就不應該搭配 XML 管線使用多重選擇的 XML 序列化屬性,並且在使用下列 XML 序列化屬性時,還要多加小心:
XmlElementAttribute
XmlAttributeAttribute
XmlArrayItemAttribute