XmlTextWriter를 사용하여 제대로 구성된 XML 만들기

업데이트: November 2007

XmlWriter에서 파생된 XmlTextWriter는 XML을 파일, 콘솔, 스트림 및 기타 출력 형식에 작성합니다. XML을 작성할 때 메서드를 사용한 추가 작업을 통해 제대로 구성된 XML이 만들어집니다. 다음 표에는 데이터를 제대로 구성하기 위해 작업을 수행하는 메서드 목록이 표시되어 있습니다.

메서드

수행한 작업에 대한 설명

WriteAttributeString

XmlTextWriter가 찾은 내용에 따라 특성의 텍스트 내용을 이스케이프합니다.

WriteString

필요한 경우 XmlTextWriter가 특수 문자를 &, <, >와 숫자 엔터티로 대체하여 이스케이프합니다.

WriteBase64

XmlTextWriter가 XmlReader의 ReadBinary를 사용하여 읽을 수 있도록 base64바이트를 인코딩합니다.

제대로 구성된 XML을 만들기 위해 XmlTextWriter는 다음과 같은 추가 작업을 수행합니다.

  • XML 요소를 올바른 순서로 작성하도록 합니다. 예를 들어, 요소 외부에 특성을 작성하거나 특성 내에 CDATA 블록을 작성하거나 루트 요소를 여러 개 작성할 수 없도록 합니다. 또한 <?xml 선언이 먼저 나오고 <!DOCTYPE 노드가 루트 요소 앞에 나오도록 합니다.

  • xml:space 특성의 값과 형식이 정확한지, 그리고 해당 값이 W3C(World Wide Web 컨소시엄) XML(Extensible Markup Language) 1.0(Second Edition) 권장 사항에 따라 사용할 수 있는 값인지 확인하십시오. 다음 예제에서는 WriteAttributeString 메서드에서 xml:space의 유효한 값을 사용한 예를 보여 줍니다.

    w.WriteAttributeString("xml:space", "", "preserve");
    

    xml:space 특성의 유효한 값은 defaultpreserve입니다. 인수가 이 두 값 중 하나에 해당하지 않으면 ArgumentException이 throw됩니다.

  • 문자열을 매개 변수로 사용했는지(예: Null==String.Empty 및 String.Empty)), 그리고 해당 매개 변수가 W3C 규칙을 따르는지를 확인합니다.

다음 표에서는 XmlTextWriter가 정의하고 XmlWriter에서 상속 또는 정의되지 않았거나 Object에서 상속된 추가 메서드 및 속성을 보여 줍니다.

메서드 또는 속성

설명

XmlTextWriter

파일 이름, 스트림 또는 TextWriter를 사용하는 XmlTextWriter의 인스턴스를 만듭니다. 오버로드된 메서드는 인코딩 형식을 정의하는 추가 매개 변수를 사용하기 위한 것입니다.

Namespaces 속성

네임스페이스 지원 여부를 지정합니다. 이 속성을 false로 설정하면 xmlns 선언이 작성되지 않으므로 콜론이 얼마든지 포함된 요소 이름을 지정할 수 있습니다.

Formatting 속성

출력 서식을 지정할 때 들여쓰기를 사용할지 여부를 정의합니다.

IndentChar 속성

들여쓰기 Formatting을 수행할 경우 들여쓰기에 사용할 문자를 정의합니다.

Indentation 속성

들여쓰기 Formatting을 수행할 경우 계층의 각 수준에 대해 작성할 IndentChars 개수를 정의합니다.

QuoteChar 속성

특성 값을 따옴표로 묶는 데 사용할 문자를 정의합니다. 이 문자는 작은따옴표 &#39;나 큰따옴표 &#34;여야 합니다.

BaseStream

XmlTextWriter가 쓰는 스트림을 반환합니다. StreamWriter에서 파생되지 않은 TextWriter를 사용하여 XmlTextWriter를 생성한 경우에는 null을 반환합니다.

다음 예제에서는 XmlTextWriter를 사용하여 XML 출력을 만듭니다.

Shared Sub WriteQuote(writer As XmlWriter, symbol As String, price As Double, change As Double, volume As Long)
   writer.WriteStartElement("Stock")
   writer.WriteAttributeString("Symbol", symbol)
   writer.WriteElementString("Price", XmlConvert.ToString(price))
   writer.WriteElementString("Change", XmlConvert.ToString(change))
   writer.WriteElementString("Volume", XmlConvert.ToString(volume))
   writer.WriteEndElement()
End Sub 'WriteQuote

Public Shared Sub Main()
   Dim writer As New XmlTextWriter(Console.Out)
   writer.Formatting = Formatting.Indented
   WriteQuote(writer, "MSFT", 74.125, 5.89, 69020000)
   writer.Close()
End Sub 'Main
static void WriteQuote(XmlWriter writer, string symbol, 
                double price, double change, long volume)
{
   writer.WriteStartElement("Stock");
   writer.WriteAttributeString("Symbol", symbol);
   writer.WriteElementString("Price", XmlConvert.ToString(price));
   writer.WriteElementString("Change", XmlConvert.ToString(change));
   writer.WriteElementString("Volume", XmlConvert.ToString(volume));
   writer.WriteEndElement();
}

public static void Main(){
    XmlTextWriter writer = new XmlTextWriter(Console.Out);
    writer.Formatting = Formatting.Indented;
    WriteQuote(writer, "MSFT", 74.125, 5.89, 69020000);
    writer.Close();
}

출력

<Stock Symbol="MSFT">
      <Price>74.125</Price>
      <Change>5.89</Change>
      <Volume>69020000</Volume>
</Stock>

WriteQuote 메서드에 입력한 내용은 string으로 나오는 주식 기호입니다. 가격과 변동은 double로, 볼륨은 long으로 선언되어 있습니다. 이러한 변수를 문자열로 변환하기 위해 XmlConvert 클래스가 사용됩니다. 이 클래스에는 모든 강력한 데이터 형식을 문자열로 변환하는 메서드가 있습니다. 뿐만 아니라 XmlConvert 클래스에는 문자열을 Microsoft .NET Framework 데이터 형식으로 변환하는 역 변환을 수행하는 메서드가 있습니다. 자세한 내용은 XML 이름 문자 인코딩 및 XML 데이터 형식 변환을 참조하십시오.

XML을 파일에 쓰는 방법을 보여 주는 샘플 코드는 XmlTextWriter.WriteProcessingInstruction을 참조하십시오. XML을 콘솔에 쓰는 방법을 보여 주는 샘플 코드는 XmlTextWriter.WriteString을 참조하십시오.

다음 코드에서는 <price>19.95</price>를 만드는 요소를 작성하는 방법을 보여 줍니다.

'Write the price.
writer.WriteElementString("price", "19.95")
//Write the price.
writer.WriteElementString("price", "19.95");

다음 코드에서는 <element name="purchaseOrder"/>를 만드는 특성을 작성하는 방법을 보여 줍니다.

writer.WriteStartElement("element")
writer.WriteAttributeString("name", "purchaseOrder")
writer.WriteEndElement()
writer.WriteStartElement("element"); 
writer.WriteAttributeString("name", "purchaseOrder"); 
writer.WriteEndElement();

특성 및 네임스페이스 선언을 작성하는 WriteAttributeString 메서드

WriteAttributeString 메서드에는 두 가지 작업이 있습니다. 하나는 특성을 작성한 다음 사용자 정의 네임스페이스 접두사와 연결하는 작업이고 다른 하나는 네임스페이스 선언을 생성하는 작업입니다. 작성하는 특성과 로컬 이름 매개 변수가 xmlns일 경우에는 이 메서드가 네임스페이스 선언으로 간주됩니다.

다음 코드 예제에서는 WriteAttributeString 메서드를 사용하여 요소 내에 특성을 작성합니다.

'Write the genre attribute.
writer.WriteAttributeString("genre", "novel")
'Write the ISBN attribute.
writer.WriteAttributeString("ISBN", "1-8630-014")
//Write the genre attribute.
writer.WriteAttributeString("genre", "novel");
//Write the ISBN attribute.
writer.WriteAttributeString("ISBN", "1-8630-014");

WriteAttributeString은 또한 찾은 내용에 따라 특성의 텍스트 내용을 이스케이프합니다. 큰따옴표가 사용된 경우에는 XmlTextWriter가 &quot;를 사용하여 특성 값의 텍스트 내용에서 큰따옴표를 이스케이프합니다. 작은따옴표가 사용된 경우에는 &apos;를 사용하여 특성 값의 텍스트 내용을 이스케이프합니다.

네임스페이스 선언을 생성하기 위해 WriteAttributeString 메서드가 오버로드되므로 응용 프로그램에서 네임스페이스 선언을 정의할 수 있습니다. 다음 코드 예제에서는 기본 네임스페이스를 두 개 만듭니다. 첫 번째 선언은 접두사가 없는 모든 요소를 첫 번째 네임스페이스 선언에 바인딩하고, "po" 접두사가 있는 모든 요소는 두 번째 네임스페이스 선언에 바인딩됩니다.

' Write the default namespace, identified as xmlns with no prefix
writer.WriteAttributeString("xmlns", Nothing, "http://www.w3.org/2000/10/XMLSchema")
' Write a namespace for the purchase order with a prefix of "po"
writer.WriteAttributeString("xmlns", "po", Nothing, "https://contoso.com/po")
// Write the default namespace, identified as xmlns with no prefix
writer.WriteAttributeString("xmlns", null, "http://www.w3.org/2000/10/XMLSchema");
// Write a namespace for the purchase order with a prefix of "po"
writer.WriteAttributeString("xmlns", "po", null, "https://contoso.com/po");

Close 메서드

Close 메서드는 스트림을 닫을 때 XML 문서가 올바른 문서인지 확인합니다. 따라서 잘못된 XML 문서가 만들어지지 않고 제대로 구성된 XML이 만들어집니다. Close 메서드는 스트림을 닫을 뿐만 아니라 필요한 WriteEnd<xxx> 메서드를 모두 호출하여 문서를 닫습니다.

메서드 쌍

XmlWriter의 메서드는 쌍으로 제공됩니다. WriteStartDocumentWriteEndDocument, WriteStartElementWriteEndElement, 그리고 WriteStartAttributeWriteEndAttribute 메서드 쌍이 있습니다. 예를 들어, 이러한 메서드를 사용하면 중첩된 요소 또는 특성을 만들 수 있습니다. 이러한 메서드 쌍으로 XML 문서를 빌드하고 복합 요소 또는 특성을 만들 수 있습니다.

WriteStartDocument 및 WriteEndDocument 메서드

WriteStartDocument는 새 문서를 시작하고 버전 특성이 "1.0"으로 설정된 XML 선언을 작성합니다. WriteEndDocument는 해당 문서를 닫습니다. 다음 WriteStartDocument를 호출하여 다음 문서를 작성하기 시작하여 서식을 지정하고, 들여쓰기를 수행하는 동안 다른 속성을 수정할 수 있습니다. WriteStartDocument 메서드는 작성할 XML 문서를 프로그래밍 방식으로 인식하고 루트 수준의 규칙을 적용합니다. 이 메서드를 사용하지 않으면 XML 조각이 만들어지고 이 조각이 제대로 구성되었는지 여부가 확인됩니다. 루트 수준의 규칙은 적용되지 않습니다. 다음 코드 예제는 문서를 시작하고 끝내는 것을 보여 줍니다.

' Write the XML declaration.
writer.WriteStartDocument()
. . .
' Close the document.
writer.WriteEndDocument()
// Write the XML declaration. 
writer.WriteStartDocument();
. . .
// Close the document.
writer.WriteEndDocument();

WriteStartElement 및 WriteEndElement 메서드

WriteStartElementWriteEndElement 쌍은 하나 이상의 요소를 구분합니다. 재정의한 모든 WriteStartElement 메서드에는 시작 태그에 대한 로컬 이름이 필수 매개 변수입니다. 다음 코드에서는 WriteStartElementWriteEndElement 메서드 쌍을 사용합니다.

' Write the title.
writer.WriteStartElement("title")
writer.WriteString("The Handmaid's Tale")
writer.WriteEndElement()
// Write the title.
writer.WriteStartElement("title");
writer.WriteString("The Handmaid's Tale");
writer.WriteEndElement();

출력

<title>The Handmaid's Tale</title>

WriteStartElement는 재정의된 메서드 시그니처를 제공하므로 코드가 해당 요소에 대한 네임스페이스 접두사를 지정할 수 있습니다. 자세한 내용은 XmlTextWriter의 요소 네임스페이스 접두사를 참조하십시오.

WriteStartAttribute 및 WriteEndAttribute 메서드

WriteStartAttributeWriteEndAttribute는 특성을 시작하고 끝낸다는 점을 제외하면 다른 시작/끝 메서드와 비슷합니다. WriteStartAttribute는 특성의 시작을 작성하고 WriteString 메서드는 특성 값을 작성하며 WriteEndAttribute는 특성 태그를 끝내는 데 사용됩니다. 다음 코드 예제에서는 WriteStartAttributeWriteEndAttribute 메서드 쌍을 보여 줍니다.

writer.WriteStartAttribute(prefix, "ISBN", "urn:samples")
writer.WriteString("1-861003-78")
writer.WriteEndAttribute()
writer.WriteStartAttribute(prefix, "ISBN", "urn:samples");
writer.WriteString("1-861003-78");
writer.WriteEndAttribute();

출력

<book bk:ISBN="1-861003-78">

WriteStartAttribute에는 오버로드된 메서드가 있으므로 응용 프로그램에서 네임스페이스 접두사를 지정하여 응용 프로그램에서 작성한 특성과 연결할 수 있습니다. 자세한 내용은 XmlTextWriter의 특성 네임스페이스 접두사를 참조하십시오.

참고 항목

개념

XmlTextWriter를 사용하여 XML 출력 서식 지정

XmlTextWriter의 네임스페이스 기능

참조

XmlTextWriter

XmlTextWriter

XmlWriter

XmlWriter

기타 리소스

XmlWriter를 사용하여 XML 작성