다음을 통해 공유


메시지 할당에 비정식 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