メッセージ割り当てにおける非正規 XPath の使用
.Net メッセージの部分を使用すると、XML シリアル化属性によってコードに注釈を付けることができますが、識別フィールドやプロパティ注釈も伴う場合、非常に複雑な XPath 式になります。 これらの複雑な XPath 式は非正規にすることができます。 非正規 XPath は、直接バインドされたオーケストレーションでのみ使用する必要があります。論理的または物理的にバインドされたオーケストレーションでは失敗する可能性があります。 直接バインドされたオーケストレーションは、XML ドキュメントの処理用のパイプラインに依存しないため、処理前に XML ドキュメント全体がメモリに読み込まれます。
正規 XPath と非正規 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 の非正規形と対比できます。 このフォームは、"一般的なフォーム" または "任意の 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 型には、Snake または Dog の場合がある Animal フィールドが含まれます。 Animal インスタンスには、NumberOfLegs フィールド に BTS.RetryCount プロパティを割り当てる PropertyAttribute によって注釈が付けられた、NumberOfLegs フィールドがあります。
Note
実際のアプリケーションでは、独自のプロパティを定義します。
ある週の動物 (AnimalOfTheWeek) が犬 (Dog) である場合、シリアル化された Zoo インスタンスは次のようになります。
<Zoo>
<Dog>
<NumberOfLegs>4</NumberOfLegs>
</Dog>
</Zoo>
ある週の動物 (AnimalOfTheWeek) がヘビ (Snake) である場合、シリアル化された Zoo インスタンスは次のようになります。
<Zoo>
<Snake>
<NumberOfLegs>0</NumberOfLegs>
</Snake>
</Zoo>
.Net の Zoo クラスと同等の XML スキーマを考えると、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