次の方法で共有


メッセージ割り当てにおける非正規 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