.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