다음을 통해 공유


XPathNavigator를 사용하여 강력한 형식의 XML 데이터에 액세스

XPath 2.0 데이터 모델의 인스턴스로서 클래스 XPathNavigator 는 CLR(공용 언어 런타임) 형식에 매핑되는 강력한 형식의 데이터를 포함할 수 있습니다. XPath 2.0 데이터 모델에 따르면 요소와 특성만 강력한 형식의 데이터를 포함할 수 있습니다. XPathNavigator 클래스는 XPathDocumentXmlDocument 개체 내 데이터를 강력한 형식의 데이터로 액세스하는 메커니즘과 하나의 데이터 형식에서 다른 데이터 형식으로 변환하는 메커니즘을 제공합니다.

XPathNavigator에서 노출하는 형식 정보

XML 1.0 데이터는 DTD, XSD(XML 스키마 정의 언어) 스키마 또는 기타 메커니즘으로 처리되지 않는 한 기술적으로 형식이 없습니다. XML 요소 또는 특성과 연결할 수 있는 형식 정보의 여러 범주가 있습니다.

  • 단순 CLR 형식: CLR(공용 언어 런타임) 형식을 직접 지원하는 XML 스키마 언어가 없습니다. 유용하게도 간단한 요소 및 속성 콘텐츠를 가장 적절한 CLR 형식으로 볼 수 있기 때문에, 스키마 정보가 없는 경우에는 모든 단순 콘텐츠가 String로 입력될 수 있으며, 스키마 정보가 추가되면 그 콘텐츠가 더 적절한 형식으로 구체화될 수 있습니다. 속성을 사용하여 단순 요소 및 특성 콘텐츠의 가장 일치하는 CLR 형식을 ValueType 찾을 수 있습니다. 스키마 기본 제공 형식에서 CLR 형식으로의 매핑에 대한 자세한 내용은 System.Xml 클래스의 형식 지원을 참조하세요.

  • CLR(Simple) 형식 목록: 단순 콘텐츠가 있는 요소 또는 특성에는 공백으로 구분된 값 목록이 포함될 수 있습니다. 값은 XML 스키마에 의해 "목록 형식"으로 지정됩니다. XML 스키마가 없는 경우 이러한 간단한 콘텐츠는 단일 텍스트 노드로 처리됩니다. XML 스키마를 사용할 수 있는 경우 이 간단한 콘텐츠는 각각 CLR 개체 컬렉션에 매핑되는 간단한 형식을 갖는 일련의 원자성 값으로 노출될 수 있습니다. 스키마 기본 제공 형식에서 CLR 형식으로의 매핑에 대한 자세한 내용은 System.Xml 클래스의 형식 지원을 참조하세요.

  • 형식화된 값: 스키마 유효성이 검사된 특성 또는 단순 형식의 요소에 형식화된 값이 있습니다. 이 값은 숫자, 문자열 또는 날짜 형식과 같은 기본 형식입니다. XSD의 모든 기본 제공 단순 형식은 단순히 String가 아니라 노드 값에 대한 액세스를 보다 적절한 형식으로 제공하는 CLR 형식에 매핑할 수 있습니다. 속성이나 자식 요소가 있는 요소는 복합 타입으로 간주됩니다. 단순 콘텐츠가 있는 복합 형식의 형식화된 값(자식인 텍스트 노드만)은 해당 콘텐츠의 단순 형식과 동일합니다. 복합 콘텐츠(하나 이상의 자식 요소)가 있는 복합 형식의 형식화된 값은 반환된 모든 자식 텍스트 노드의 연결 문자열 값입니다 String. 스키마 기본 제공 형식에서 CLR 형식으로의 매핑에 대한 자세한 내용은 System.Xml 클래스의 형식 지원을 참조하세요.

  • Schema-Language 특정 형식 이름: 대부분의 경우 외부 스키마를 적용하는 부작용으로 설정된 CLR 형식은 노드 값에 대한 액세스를 제공하는 데 사용됩니다. 그러나 XML 문서에 적용된 특정 스키마와 연결된 형식을 검사하려는 경우가 있을 수 있습니다. 예를 들어 XML 문서를 검색하여 연결된 스키마에 따라 "PurchaseOrder" 형식의 콘텐츠가 있는 것으로 확인되는 모든 요소를 추출할 수 있습니다. 이러한 형식 정보는 스키마 유효성 검사 결과로서만 설정될 수 있으며, 이 정보는 XmlType 클래스의 SchemaInfoXPathNavigator 속성을 통해 액세스됩니다. 자세한 내용은 아래 PSVI(Post Schema Validation Infoset) 섹션을 참조하세요.

  • Schema-Language 특정 형식 리플렉션: 다른 경우에는 XML 문서에 적용된 스키마별 형식에 대한 자세한 정보를 얻을 수 있습니다. 예를 들어 XML 파일을 읽을 때 사용자 지정 계산을 수행하기 위해 XML 문서의 유효한 각 노드에 대한 특성을 추출 maxOccurs 할 수 있습니다. 이 정보는 스키마 유효성 검사를 통해서만 설정되므로 SchemaInfo 클래스의 XPathNavigator 속성을 통해 액세스할 수 있습니다. 자세한 내용은 아래 PSVI(Post Schema Validation Infoset) 섹션을 참조하세요.

XPathNavigator 형식화된 접근자

다음 표에서는 노드에 대한 형식 정보에 액세스하는 데 사용할 수 있는 클래스의 XPathNavigator 다양한 속성과 메서드를 보여 줍니다.

재산 설명
XmlType 유효한 경우 노드에 대한 XML 스키마 형식 정보가 포함됩니다.
SchemaInfo 여기에는 유효성 검사 후에 추가되는 노드의 사후 스키마 유효성 검사 정보 세트가 포함됩니다. 여기에는 XML 스키마 형식 정보와 유효성 정보가 포함됩니다.
ValueType 노드의 형식화된 값에 대한 CLR 형식입니다.
TypedValue 노드의 콘텐츠는 노드의 XML 스키마 형식과 가장 일치하는 형식으로 표현된 하나 이상의 CLR 값입니다.
ValueAsBoolean XPath 2.0 캐스팅 규칙에 따라 현재 노드의 String 값이 Boolean 값으로 캐스팅 됩니다.
ValueAsDateTime XPath 2.0 캐스팅 규칙에 따라 현재 노드의 String 값이 DateTime 값으로 캐스팅 됩니다.
ValueAsDouble XPath 2.0 캐스팅 규칙에 따라 현재 노드의 String 값이 Double 값으로 캐스팅 됩니다.
ValueAsInt XPath 2.0 캐스팅 규칙에 따라 현재 노드의 String 값이 Int32 값으로 캐스팅 됩니다.
ValueAsLong XPath 2.0 캐스팅 규칙에 따라 현재 노드의 String 값이 Int64 값으로 캐스팅 됩니다.
ValueAs XPath 2.0 캐스팅 규칙에 따라 노드의 내용이 대상 형식으로 캐스팅됩니다.

스키마 기본 제공 형식에서 CLR 형식으로의 매핑에 대한 자세한 내용은 System.Xml 클래스의 형식 지원을 참조하세요.

포스트 스키마 유효성 검사 정보 세트 (PSVI)

XML 스키마 프로세서는 XML Infoset을 입력으로 받아 PSVI(Post Schema Validation Infoset)로 변환합니다. PSVI는 새 정보 항목이 추가되고 새 속성이 기존 정보 항목에 추가된 원래 입력 XML 정보 세트입니다. PSVI의 XML Infoset에 추가되고 XPathNavigator에 의해 노출되는 세 가지 주요 정보 클래스가 있습니다.

  1. 유효성 검사 결과: 요소 또는 특성의 유효성이 성공적으로 검사되었는지 여부에 대한 정보입니다. Validity 클래스의 SchemaInfo 속성의 XPathNavigator 속성에 의해 노출됩니다.

  2. 기본 정보: 스키마에 지정된 기본값을 통해 요소 또는 특성의 값을 얻었는지 여부를 나타냅니다. IsDefault 클래스의 SchemaInfo 속성의 XPathNavigator 속성에 의해 노출됩니다.

  3. 형식 주석: 형식 정의 또는 요소 및 특성 선언일 수 있는 스키마 구성 요소에 대한 참조입니다. 노드가 유효하다면 XmlType 속성은 XPathNavigator의 특정 유형 정보를 포함합니다. 노드의 유효성이 확인된 후에 수정된 경우와 같이 노드의 유효성이 불확실한 경우. 그런 다음 XmlType 속성이 null로 설정되지만, SchemaInfo 클래스의 XPathNavigator 속성의 다양한 속성에서 형식 정보를 계속 이용할 수 있습니다.

다음 예제는 XPathNavigator에 의해 제공되는 사후 스키마 유효성 검증 정보 세트의 정보를 사용하는 방법을 보여 줍니다.

Dim settings As XmlReaderSettings = New XmlReaderSettings()  
settings.Schemas.Add("http://www.contoso.com/books", "books.xsd")  
settings.ValidationType = ValidationType.Schema  
  
Dim reader As XmlReader = XmlReader.Create("books.xml", settings)  
  
Dim document As XmlDocument = New XmlDocument()  
document.Load(reader)  
Dim navigator As XPathNavigator = document.CreateNavigator()  
navigator.MoveToChild("books", "http://www.contoso.com/books")  
navigator.MoveToChild("book", "http://www.contoso.com/books")  
navigator.MoveToChild("published", "http://www.contoso.com/books")  
  
Console.WriteLine(navigator.SchemaInfo.SchemaType.Name)  
Console.WriteLine(navigator.SchemaInfo.Validity)  
Console.WriteLine(navigator.SchemaInfo.SchemaElement.MinOccurs)  
XmlReaderSettings settings = new XmlReaderSettings();  
settings.Schemas.Add("http://www.contoso.com/books", "books.xsd");  
settings.ValidationType = ValidationType.Schema;  
  
XmlReader reader = XmlReader.Create("books.xml", settings);  
  
XmlDocument document = new XmlDocument();  
document.Load(reader);  
XPathNavigator navigator = document.CreateNavigator();  
navigator.MoveToChild("books", "http://www.contoso.com/books");  
navigator.MoveToChild("book", "http://www.contoso.com/books");  
navigator.MoveToChild("published", "http://www.contoso.com/books");  
  
Console.WriteLine(navigator.SchemaInfo.SchemaType.Name);  
Console.WriteLine(navigator.SchemaInfo.Validity);  
Console.WriteLine(navigator.SchemaInfo.SchemaElement.MinOccurs);  

이 예제에서는 books.xml 파일을 입력으로 사용합니다.

<books xmlns="http://www.contoso.com/books">  
    <book>  
        <title>Title</title>  
        <price>10.00</price>  
        <published>2003-12-31</published>  
    </book>  
</books>  

또한 이 예제에서는 스키마를 books.xsd 입력으로 사용합니다.

<xs:schema xmlns="http://www.contoso.com/books"
attributeFormDefault="unqualified" elementFormDefault="qualified"
targetNamespace="http://www.contoso.com/books"
xmlns:xs="http://www.w3.org/2001/XMLSchema">  
    <xs:simpleType name="publishedType">  
        <xs:restriction base="xs:date">  
            <xs:minInclusive value="2003-01-01" />  
            <xs:maxInclusive value="2003-12-31" />  
        </xs:restriction>  
    </xs:simpleType>  
    <xs:complexType name="bookType">  
        <xs:sequence>  
            <xs:element name="title" type="xs:string"/>  
            <xs:element name="price" type="xs:decimal"/>  
            <xs:element name="published" type="publishedType"/>  
        </xs:sequence>  
    </xs:complexType>  
    <xs:complexType name="booksType">  
        <xs:sequence>  
            <xs:element name="book" type="bookType" />  
        </xs:sequence>  
    </xs:complexType>  
    <xs:element name="books" type="booksType" />  
</xs:schema>  

ValueAs 속성을 사용하여 형식화된 값 가져오기

노드의 TypedValue 형식화된 값은 XPathNavigator의 속성에 액세스하여 검색할 수 있습니다. 경우에 따라 노드의 형식화된 값을 다른 형식으로 변환할 수 있습니다. 일반적인 예는 XML 노드에서 숫자 값을 가져오는 것입니다. 예를 들어 다음과 같은 검증되지 않은 XML 문서와 형식화되지 않은 XML 문서를 고려해 보세요.

<books>  
    <book>  
        <title>Title</title>  
        <price>10.00</price>  
        <published>2003-12-31</published>  
    </book>  
</books>  

XPathNavigatorprice 요소에 배치되면, XmlType 속성은 null이고, ValueType 속성은 String이며, TypedValue 속성은 문자열 10.00입니다.

그러나 ValueAs, ValueAsDouble, ValueAsInt, 또는 ValueAsLong 메서드와 속성을 사용하여 값을 숫자 값으로 여전히 추출할 수 있습니다. 다음 예는 ValueAs 메서드를 사용하여 이러한 캐스트를 수행하는 방법을 보여줍니다.

Dim document As New XmlDocument()  
document.Load("books.xml")  
Dim navigator As XPathNavigator = document.CreateNavigator()  
navigator.MoveToChild("books", "")  
navigator.MoveToChild("book", "")  
navigator.MoveToChild("price", "")  
  
Dim price = navigator.ValueAs(GetType(Decimal))  
Dim discount As Decimal = 0.2  
  
Console.WriteLine("The price of the book has been dropped 20% from {0:C} to {1:C}", navigator.Value, (price - price * discount))  
XmlDocument document = new XmlDocument();  
document.Load("books.xml");  
XPathNavigator navigator = document.CreateNavigator();  
navigator.MoveToChild("books", "");  
navigator.MoveToChild("book", "");  
navigator.MoveToChild("price", "");  
  
Decimal price = (decimal)navigator.ValueAs(typeof(decimal));  
  
Console.WriteLine("The price of the book has been dropped 20% from {0:C} to {1:C}", navigator.Value, (price - price * (decimal)0.20));  

스키마 기본 제공 형식에서 CLR 형식으로의 매핑에 대한 자세한 내용은 System.Xml 클래스의 형식 지원을 참조하세요.

참고하십시오