次の方法で共有


メッセージ割り当てでの非正規 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" とも呼ばれ、任意に複雑で、複数の軸を組み合わせて使用できる式 ( //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 インスタンスには、PropertyAttribute によって注釈が付けられ、BTS.RetryCount プロパティが割り当てられた NumberOfLegs フィールドがあります。

実際のアプリケーションでは、独自のプロパティを定義します。

週の動物が犬の場合、シリアル化された Zoo インスタンスは次のようになります。

<Zoo>
  <Dog>
    <NumberOfLegs>4</NumberOfLegs>
  </Dog>
</Zoo>

週の動物がヘビの場合、シリアル化された Zoo インスタンスは次のようになります。

<Zoo>
  <Snake>
    <NumberOfLegs>0</NumberOfLegs>
  </Snake>
</Zoo>

.Net Zoo クラスと同等の Xml スキーマを考慮すると、RetryCount プロパティを選択するための XPath 式を使用すると、プロパティへのパスにスネークステップまたは 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