XmlDocument 클래스를 사용하여 XmlDocument 객체에 포함된 XML 콘텐츠의 유효성을 두 가지 방법으로 검사할 수 있습니다. 첫 번째 방법은 XmlReader 유효성 검사 개체를 사용하여 XML 콘텐츠를 유효성 검사를 수행하는 것이며, 두 번째 방법은 Validate 클래스의 XmlDocument 메서드를 사용하는 것입니다. 클래스를 사용하여 XPathDocument XML 콘텐츠의 읽기 전용 유효성 검사를 수행할 수도 있습니다.
XML 데이터 유효성 검사
클래스는 XmlDocument 기본적으로 DTD 또는 XSD(XML 스키마 정의 언어) 스키마 유효성 검사를 사용하여 XML 문서의 유효성을 검사하지 않습니다. XML 문서의 형식이 올바른지 확인합니다.
XML 문서의 유효성을 검사하는 첫 번째 방법은 문서를 XmlDocument 개체로 로드할 때 유효성을 검사하는 XmlReader 개체를 사용하는 것입니다. 두 번째 방법은 클래스의 메서드를 사용하여 이전에 형식화되지 않은 XML 문서의 유효성을 Validate 검사하는 것입니다 XmlDocument . 두 경우 모두 클래스 Validate의 메서드 XmlDocument를 사용하여 유효성이 검사된 XML 문서의 변경 내용을 다시 유효성 검사할 수 있습니다.
문서가 로드될 때 유효성 검사
유효성 검사 개체는 XmlReader 클래스의 XmlReaderSettings 메서드에 Create 개체를 전달하여 생성됩니다. 이 메서드는 XmlReader 개체를 매개 변수로 사용합니다.
XmlReaderSettings 매개 변수로 전달된 개체에는 ValidationType 속성이 Schema
로 설정되어 있으며, XmlDocument 속성에는 Schemas 개체에 포함된 XML 문서의 XML 스키마가 추가됩니다. 그런 다음 유효성 검사 XmlReader 개체를 사용하여 개체를 만듭니다 XmlDocument .
다음 예제에서는 contosoBooks.xml
유효성 검사 개체를 사용하여 XmlDocument 개체를 생성함으로써, 파일이 XmlDocument 개체에 로드될 때 XmlReader 파일의 유효성을 검사합니다. XML 문서는 해당 스키마에 따라 유효하므로 스키마 유효성 검사 오류 또는 경고가 생성되지 않습니다.
Imports System
Imports System.Xml
Imports System.Xml.Schema
Imports System.Xml.XPath
Class ValidatingReaderExample
Shared Sub Main(ByVal args() As String)
Try
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
settings.ValidationType = ValidationType.Schema
Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml", settings)
Dim document As XmlDocument = New XmlDocument()
document.Load(reader)
Dim navigator As XPathNavigator = document.CreateNavigator()
Catch e As Exception
Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message)
End Try
End Sub
Shared Sub SchemaValidationHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)
Select Case e.Severity
Case XmlSeverityType.Error
Console.WriteLine("Schema Validation Error: {0}", e.Message)
Exit Sub
Case XmlSeverityType.Warning
Console.WriteLine("Schema Validation Warning: {0}", e.Message)
Exit Sub
End Select
End Sub
End Class
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.XPath;
class ValidatingReaderExample
{
static void Main(string[] args)
{
try
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
XPathNavigator navigator = document.CreateNavigator();
}
catch (Exception e)
{
Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message);
}
}
static void SchemaValidationHandler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine("Schema Validation Error: {0}", e.Message);
break;
case XmlSeverityType.Warning:
Console.WriteLine("Schema Validation Warning: {0}", e.Message);
break;
}
}
}
이 예제에서는 파일을 입력으로 사용합니다 contosoBooks.xml
.
<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://www.contoso.com/books">
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
또한 이 예제에서는 contosoBooks.xsd
입력으로 사용합니다.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bookstore">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string" />
<xs:element minOccurs="0" name="first-name" type="xs:string" />
<xs:element minOccurs="0" name="last-name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="price" type="xs:decimal" />
</xs:sequence>
<xs:attribute name="genre" type="xs:string" use="required" />
<xs:attribute name="publicationdate" type="xs:date" use="required" />
<xs:attribute name="ISBN" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XmlSchemaValidationException는 위의 예제에서 Load가 호출될 때, 속성 또는 요소의 형식이 유효성 검사 스키마에 지정된 해당 형식과 일치하지 않을 경우 발생합니다. ValidationEventHandler이/가 유효성 검사 중인 XmlReader에 설정되면, 잘못된 유형이 발견될 때마다 ValidationEventHandler이/가 호출됩니다.
XmlSchemaException가 TypedValue로 설정된 invalid
특성 또는 요소에 액세스할 때 XPathNavigator가 throw됩니다.
속성을 Validity 사용하여 특성 또는 요소 XPathNavigator에 액세스할 때 개별 특성 또는 요소가 유효한지 여부를 확인할 수 있습니다.
비고
XML 문서가 기본값 XmlDocument 을 정의하는 연결된 스키마를 사용하여 개체에 XmlDocument 로드되면 개체는 이러한 기본값을 XML 문서에 나타난 것처럼 처리합니다. 즉 IsEmptyElement , XML 문서에서 빈 요소로 작성된 경우에도 스키마에서 기본값으로 지정된 요소에 대해 속성이 항상 반환 false
됩니다.
유효성 검사 메서드를 사용하여 문서 유효성 검사
Validate 클래스의 XmlDocument 메서드는 XmlDocument 개체에 포함된 XML 문서를 XmlDocument 개체의 Schemas 속성에 지정된 스키마에 대해 유효성을 검사하고 정보 집합 확대를 수행합니다. 결과는 XmlDocument 객체의 형식화된 문서로 대체되기 전의 형식화되지 않은 XML 문서입니다.
XmlDocument 개체는 ValidationEventHandler 메서드의 매개 변수로 전달된 Validate 대리자를 사용하여 스키마 유효성 검사 오류 및 경고를 보고합니다.
다음 예제는 contosoBooks.xml
개체에 포함된 XmlDocument 파일을 contosoBooks.xsd
개체의 XmlDocument 속성에 포함된 Schemas 스키마에 따라 유효성을 검사합니다.
Imports System
Imports System.Xml
Imports System.Xml.Schema
Imports System.Xml.XPath
Class ValidateExample
Shared Sub Main(ByVal args() As String)
Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
document.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
Dim validation As ValidationEventHandler = New ValidationEventHandler(AddressOf SchemaValidationHandler)
document.Validate(validation)
End Sub
Shared Sub SchemaValidationHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)
Select Case e.Severity
Case XmlSeverityType.Error
Console.WriteLine("Schema Validation Error: {0}", e.Message)
Exit Sub
Case XmlSeverityType.Warning
Console.WriteLine("Schema Validation Warning: {0}", e.Message)
Exit Sub
End Select
End Sub
End Class
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.XPath;
class ValidateExample
{
static void Main(string[] args)
{
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();
document.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
ValidationEventHandler validation = new ValidationEventHandler(SchemaValidationHandler);
document.Validate(validation);
}
static void SchemaValidationHandler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine("Schema Validation Error: {0}", e.Message);
break;
case XmlSeverityType.Warning:
Console.WriteLine("Schema Validation Warning: {0}", e.Message);
break;
}
}
}
이 예제에서는 파일을 입력으로 사용합니다 contosoBooks.xml
.
<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://www.contoso.com/books">
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
또한 이 예제에서는 contosoBooks.xsd
입력으로 사용합니다.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bookstore">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string" />
<xs:element minOccurs="0" name="first-name" type="xs:string" />
<xs:element minOccurs="0" name="last-name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="price" type="xs:decimal" />
</xs:sequence>
<xs:attribute name="genre" type="xs:string" use="required" />
<xs:attribute name="publicationdate" type="xs:date" use="required" />
<xs:attribute name="ISBN" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
수정 유효성 검사
XML 문서를 수정한 후에는 Validate 클래스의 XmlDocument 메서드를 사용하여 XML 문서의 스키마에 대한 수정 내용의 유효성을 검사할 수 있습니다.
다음 예제에서는 contosoBooks.xml
유효성 검사 개체를 사용하여 XmlDocument 개체를 생성함으로써, 파일이 XmlDocument 개체에 로드될 때 XmlReader 파일의 유효성을 검사합니다. XML 문서는 스키마 유효성 검사 오류 또는 경고를 생성하지 않고 로드될 때 성공적으로 유효성을 검사합니다. 그런 다음 스키마에 따라 contosoBooks.xsd
잘못된 XML 문서를 두 가지 수정합니다. 첫 번째 수정은 스키마 유효성 검사 오류를 초래하는 잘못된 자식 요소를 삽입하고, 두 번째 수정은 형식화된 노드의 값을 예외가 발생하는 노드의 형식에 따라 잘못된 값으로 설정합니다.
Imports System
Imports System.Xml
Imports System.Xml.Schema
Imports System.Xml.XPath
Class ValidatingReaderExample
Shared Sub Main(ByVal args() As String)
Try
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
settings.ValidationType = ValidationType.Schema
Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml", settings)
Dim document As XmlDocument = New XmlDocument()
document.Load(reader)
Dim navigator As XPathNavigator = document.CreateNavigator()
Dim validation As ValidationEventHandler = New ValidationEventHandler(AddressOf SchemaValidationHandler)
navigator.MoveToChild("bookstore", "http://www.contoso.com/books")
navigator.MoveToChild("book", "http://www.contoso.com/books")
navigator.MoveToChild("author", "http://www.contoso.com/books")
navigator.AppendChild("<title>Book Title</title>")
document.Validate(validation)
navigator.MoveToParent()
navigator.MoveToChild("price", "http://www.contoso.com/books")
navigator.SetTypedValue(DateTime.Now)
Catch e As Exception
Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message)
End Try
End Sub
Shared Sub SchemaValidationHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)
Select Case e.Severity
Case XmlSeverityType.Error
Console.WriteLine("Schema Validation Error: {0}", e.Message)
Exit Sub
Case XmlSeverityType.Warning
Console.WriteLine("Schema Validation Warning: {0}", e.Message)
Exit Sub
End Select
End Sub
End Class
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.XPath;
class ValidatingReaderExample
{
static void Main(string[] args)
{
try
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
XPathNavigator navigator = document.CreateNavigator();
ValidationEventHandler validation = new ValidationEventHandler(SchemaValidationHandler);
navigator.MoveToChild("bookstore", "http://www.contoso.com/books");
navigator.MoveToChild("book", "http://www.contoso.com/books");
navigator.MoveToChild("author", "http://www.contoso.com/books");
navigator.AppendChild("<title>Book Title</title>");
document.Validate(validation);
navigator.MoveToParent();
navigator.MoveToChild("price", "http://www.contoso.com/books");
navigator.SetTypedValue(DateTime.Now);
}
catch (Exception e)
{
Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message);
}
}
static void SchemaValidationHandler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine("Schema Validation Error: {0}", e.Message);
break;
case XmlSeverityType.Warning:
Console.WriteLine("Schema Validation Warning: {0}", e.Message);
break;
}
}
}
이 예제에서는 파일을 입력으로 사용합니다 contosoBooks.xml
.
<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://www.contoso.com/books">
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
또한 이 예제에서는 contosoBooks.xsd
입력으로 사용합니다.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bookstore">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string" />
<xs:element minOccurs="0" name="first-name" type="xs:string" />
<xs:element minOccurs="0" name="last-name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="price" type="xs:decimal" />
</xs:sequence>
<xs:attribute name="genre" type="xs:string" use="required" />
<xs:attribute name="publicationdate" type="xs:date" use="required" />
<xs:attribute name="ISBN" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
위의 예제에서는 개체에 포함된 XmlDocument XML 문서를 두 가지로 수정했습니다. XML 문서가 로드될 때 발생한 스키마 유효성 검사 오류는 유효성 검사 이벤트 처리기 메서드에 의해 처리되어 콘솔에 기록되었을 것입니다.
이 예제에서는 XML 문서를 로드한 후 Validate 클래스의 XmlDocument 메서드를 사용하여 유효성 검사 오류가 도입된 것을 발견했습니다.
SetTypedValue 방법을 사용한 클래스 XPathNavigator의 수정 사항은 노드의 스키마 유형에 따라 새로운 값이 잘못되어 InvalidCastException을 초래했습니다.
메서드를 사용하여 SetTypedValue 값을 수정하는 방법에 대한 자세한 내용은 XPathNavigator 항목을 사용하여 XML 데이터 수정 항목을 참조하세요.
Read-Only 유효성 검사
이 XPathDocument 클래스는 XML 문서의 읽기 전용 메모리 내 표현입니다. XPathDocument 클래스와 XmlDocument 클래스는 모두 XML 문서를 탐색하고 편집할 개체를 만듭니다XPathNavigator. XPathDocument 클래스가 읽기 전용 클래스이므로, XPathNavigator 객체에서 반환된 XPathDocument 객체는 XPathDocument 객체에 포함된 XML 문서를 편집할 수 없습니다.
유효성 검사의 경우, 앞에서 설명한 대로 유효성 검사 XPathDocument 개체를 사용하여 XmlDocument 개체를 만드는 것처럼 XmlReader 개체를 생성할 수 있습니다. 개체는 XPathDocument 로드될 때 XML 문서의 유효성을 검사하지만 개체의 XPathDocument XML 데이터를 편집할 수 없으므로 XML 문서의 유효성을 다시 검사할 수 없습니다.
읽기 전용 및 편집 가능한 XPathNavigator 개체에 대한 자세한 내용은 XPathDocument 및 XmlDocument 항목을 사용하여 XML 데이터 읽기 를 참조하세요.
참고하십시오
.NET