메시지 할당에 비정식 XPath 사용
.Net 메시지 파트를 사용하는 경우 고유 필드 및/또는 속성 주석과도 함께 사용되어 매우 복잡한 XPath 식이 될 수 있는 XML serialization 특성을 사용하여 코드에 주석을 달 수 있습니다. 이러한 복잡한 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 유형은 Snake 또는 Dog일 수 있는 Animal 필드를 포함합니다. Animal 인스턴스에는 이 필드에 BTS.RetryCount 속성을 할당하는 PropertyAttribute를 사용하여 주석이 추가되는 NumberOfLegs 필드가 있습니다.
참고
실제 응용 프로그램에서는 자체적으로 고유한 속성을 정의합니다.
그 주의 동물이 Dog일 때 serialize된 Zoo 인스턴스는 다음과 같이 보입니다.
<Zoo>
<Dog>
<NumberOfLegs>4</NumberOfLegs>
</Dog>
</Zoo>
그 주의 동물이 Snake일 때 serialize된 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 serialization 특성을 XML 파이프라인과 함께 사용하지 말아야 하며 다음 XML serialization 특성을 사용할 때 주의해야 합니다.
XmlElementAttribute
XmlAttributeAttribute
XmlArrayItemAttribute