python

XSD: XML 스키마 정의

vhxpffltm 2020. 5. 13. 22:15

XSD는 XML 스키마 정의(XML Schema Definition)를 의미한다.

XSD는 XML 문서의 구조 및 해당 문서가 포함할 수 있는 적법한 요소와 속성을 명시하는 것이며 해당 XML 문서가 유효한(valid) XML 문서로써 포함할 수 있는 관계를 정의한다.

 

XSD의 구성요소는 아래와 같다.

 

xmlns:xs: XSD의 요소와 타입에 사용할 W3C의 XML 스키마 네임스페이스를 명시한다.

targetNamespace:  요소를 정의할 XML 스키마 네임스페이스를 명시한다.

xmlns: 기본 XML 스키마 네임스페이스를 명시한다.

elementFormDefault: 해당 스키마를 이용해 선언한 XML 문서의 모든 요소가 네임스페이스를 만족한다는 것을 명시한다.

 

이전에 만든 XML 문서를 토대로 XSD를 변환할 수 있다. Online Convertor를 사용하여 XSD의 기본틀을 얻을 수 있다.

https://www.liquid-technologies.com/online-xml-to-xsd-converter

 

 

위와 같이 XSD를 쉽게 구할 수 있다. 그렇다면 XSD에 필요한 내용을 알아야 하는데 그건 https://www.w3schools.com/xml/schema_intro.asp 이곳에서 참고할 수 있다.

 

몇몇 요소를 살펴보면 <schema> 태그가 있다. 위에서도 간단히 설명했다.

 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

스키마에 사용 된 요소 및 데이터 유형은 "http://www.w3.org/2001/XMLSchema"네임 스페이스에서 온 것임을 나타낸다. 또한 "http://www.w3.org/2001/XMLSchema"네임 스페이스에서 오는 요소 및 데이터 유형 앞에 xs를 붙여야한다.


targetNamespace="https://www.w3schools.com"

이 스키마에 의해 정의 된 요소 (참고,받는 사람, 제목, 본문)가 "https://www.w3schools.com"네임 스페이스에서 온 것.


xmlns="https://www.w3schools.com"

기본 네임 스페이스가 "https://www.w3schools.com"임을 나타낸다.


elementFormDefault="qualified"
>

이 스키마에서 선언 된 XML 인스턴스 문서에서 사용하는 모든 요소는 네임 스페이스로 규정되어야 함을 나타낸다.

 

 

 

그렇다면 XML 문서에서 스키마를 참조할때를 보자. XML 문서 최상단 태그에 아래와 같은 태그를 사용할 수 있다.

 

xmlns="https://www.w3schools.com"

스키마 유효성 검사기에 이 XML 문서에 사용 된 모든 요소가 "https://www.w3schools.com"네임 스페이스에 선언되어 있음을 알려준다.

 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

XML 스키마 인스턴스 네임 스페이스를 사용할 수있게되면 위와같이 선언한다.


xsi:schemaLocation="https://www.w3schools.com sample.xsd"

첫 번째 값은 사용할 네임 스페이스, 두 번째 값은 해당 네임 스페이스에 사용할 XML 스키마의 위치이다.

 

 

XSD의 중요한점은 이 XML의 요소를 정의한다는 것이다. 위의 XSD를 보면 elemnt: ... 로 요소를 정의하는 부분이 있다. 이곳에 type을 사용하여 값을 정의한다. 사용되는것은 보통 아래와 같다.

  • xs:string

  • xs:decimal

  • xs:integer

  • xs:boolean

  • xs:date

  • xs:time

그 외 fixed와 default도 있는데 해당 내용과 위의 내용은 래퍼런스를 참고바란다.

 

그리고 attribute와 restriction 속성을 사용하여 열거형 데이터를 나열하는 등 다양한 속성이 존재한다.

필자는 열거형 데이터를 위해 restriction 과 enumeration 을 사용하여 해당 태그에 대한 값들을 제한하였다.

 

이 부분도 래퍼런스를 참고바라며 생성한 XSD를 사용자 정의에 따라 수정해주는 작업이 필요하다.

 

 

XSD 유효성 검사

 

위의 내용을 적은것은 이제 우리가 만든 XSD를 토대로 해당 XML이 유효한가를 판별하기 위한 서론이었다.

XML을 만들었으며 이제 상위태그에 필요한 xmlns, xmlns:xs 등을 사용하여 우리가 정의한 XSD를 사용하여 해당 XML 문서가 XSD에 유효한 문서인지 검증하는 단계가 필요하다.

 

다행히, C# 언어로 작성된 코드로 MS에서 제공해주는 XSD 유효성 검사가 존재한다.

https://docs.microsoft.com/ko-kr/dotnet/standard/data/xml/xml-schema-xsd-validation-with-xmlschemaset

 

이제 이것을 기반으로 우리가 정의한 XSD를 XML 문서에 유효한지를 판별할 것이다.

 

*결과 추후 공개* 

 

우선 마이크로소프트의 XSD 유효성 검사코드는 아래와 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Xml;
using System.Xml.Schema;
 
class XmlSchemaSetExample
{
    static void Main()
    {
        XmlReaderSettings booksSettings = new XmlReaderSettings();
        booksSettings.Schemas.Add("http://www.contoso.com/books""books.xsd");
        booksSettings.ValidationType = ValidationType.Schema;
        booksSettings.ValidationEventHandler += new ValidationEventHandler(booksSettingsValidationEventHandler);
 
        XmlReader books = XmlReader.Create("books.xml", booksSettings);
 
        while (books.Read()) { }
    }
 
    static void booksSettingsValidationEventHandler(object sender, ValidationEventArgs e)
    {
        if (e.Severity == XmlSeverityType.Warning)
        {
            Console.Write("WARNING: ");
            Console.WriteLine(e.Message);
        }
        else if (e.Severity == XmlSeverityType.Error)
        {
            Console.Write("ERROR: ");
            Console.WriteLine(e.Message);
        }
    }
}
 
cs

여기서 XML파일과 XSD의 가장 상위에 xmlns 와 targetNamespace를 선언해주어야 한다. 

실험 파일을 모두 공개할 수 없고 위의 태그만 확인해본다.

 

 

1
2
3
<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Technologies Online Tools 1.0 (https://www.liquid-technologies.com) -->
<root xmlns = "http://www.write.com">
cs

 

schema인 xsd 파일과 xml 문서의 상위 태그내용이다. 해당 xml 문서가 XSD에 유효한지 확인하기 위해 네임스페이스를 일치시켜줘야 한다. 그 내용이 위 코드의 booksSettings.Schemas.Add("http://www.contoso.com/books""books.xsd");

부분이다. 여기에 알맞은 namespace URL을 넣어주면 된다. 물론 XSD 파일과 xml파일을 검증하고 싶은 파일명으로 넣어주면 끝이다. URL은 자신이 사용하고자 하는 아무 URL을 입력하면 된다. XML은 URL의 이름으로 네임스페이스를 확인한다.

 

프로그램을 실행하여 아무 문제가 없다면 경고나 에러메세지가 없다. 아래 결과는 어떤 문제가 있을 때 나타나는 결과이다.

 

XSD에 해당 태그의 값은 postiveInteger로 정의되어 있다. 하지만 음수값이 들어갔으므로 위와같은 에러를 발생시킨다.

 

XSD를 새로 정의하면서 사용한 요소는 choice 요소가 있다, 관련 내용은 Refernce를 참고하자.

 

Reference

https://www.w3schools.com/xml/schema_intro.asp

tcpschool.com/xml/xml_xsd_intro

https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/ms256109(v%3Dvs.100)