[XML.NET] 11. XmlWriter 개체로 XML 데이터 작성(Attribute 쓰기)

요소의 특성을 쓸 때는 WriteStartAttribute, WriteAttributeString, WriteAttributes 메서드를 이용합니다.

 WriteStartAttribute 메서드는 특성의 시작을 작성할 때 사용하는데 WriteEndAttribute 메서드를 이용하여 특성의 끝을 작성해야 합니다.

public void WriteStartAttribute (string name);
public void WriteStartAttribute (string name, string ns);
public void WriteStartAttribute (string prefix, string name, string ns);
public void WriteEndAttribute ( );

  WriteAttributeString 메서드를 이용하면 값이 있는 특성을 쉽게 작성할 수 있습니다.

public void WriteAttributeString (string name, string value);
public void WriteAttributeString (string name, string ns, string value);
public void WriteAttributeString (string prefix, string name, string ns, string value);

  WriteAttributes 메서드를 이용하면 XmlReader의 현재 위치에 있는 모든 특성을 작성할 수 있습니다.

public void WriteAttributes (XmlReader reader, bool defattr);

  다음의 예제 코드는 세 가지 방법으로 특성 쓰기를 사용하는 예제입니다. 먼저 “data.xml” 파일을 출력 파일로 설정한 XmlWriter 개체를 생성하여 books 루트 요소를 쓰고 두 개의 자식 요소 book을 쓰기 작업합니다. 첫 번째 book 요소의 title 특성을 쓸 때는 WriteStartAttribute 메서드를 이용하였습니다. 두 번째book 요소의 title 특성을 쓸 때는 WriteAttributeString 메서드를 이용하였습니다.

 그리고 작성한 “data.xml” 파일을 소스 파일로 설정한 XmlReader 개체를 생성하고 Console.Out을 출력 파일로 설정한 XmlWriter 개체를 생성한 후에XmlReader 개체의 Read 메서드를 반복하여 호출하여 읽어온 노드 타입이 요소일 때 XmlReader 개체의 현재 위치에 있는 모든 특성 정보를 WriteAttributes메서드를 이용하여 출력하였습니다.

using System;
using System.Xml;

namespace 예제_2._3_XmlWriter_개체로_특성_쓰기
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            XmlWriter writer = XmlWriter.Create("data.xml", settings);

            writer.WriteComment("XmlWriter 개체로 특성 쓰기");

            writer.WriteStartElement("books"); //루트 요소 쓰기

            writer.WriteStartElement("book");//book 요소 쓰기
            writer.WriteStartAttribute("title"); //title 특성 쓰기
            writer.WriteString("XML.NET"); //title 특성 값 쓰기
            writer.WriteEndAttribute(); //title 특성 닫기
            writer.WriteStartAttribute("가격");//가격 특성 쓰기
            writer.WriteValue(12000); //가격 특성 값 쓰기
            writer.WriteEndAttribute(); //가격 특성 닫기
            writer.WriteEndElement(); //book 요소 닫기

            writer.WriteStartElement("book");//book 요소 쓰기
            writer.WriteAttributeString("title", "ADO.NET");//title 특성과 값 쓰기
            writer.WriteStartAttribute("가격");//가격 특성 쓰기
            writer.WriteValue(15000);//가격 특성 값 쓰기
            writer.WriteEndAttribute();//가격 특성 닫기
            writer.WriteEndElement();//book 요소 닫기

            writer.WriteEndElement();//루트 요소 닫기

            writer.Close();

            //XmlReader 개체 생성
            XmlReader xreader = XmlReader.Create("data.xml"); 
            //콘솔 출력으로 하는 XmlWriter 개체 생성
            XmlWriter xwriter = XmlWriter.Create(Console.Out,settings); 
            while (xreader.Read())
            {
                if (xreader.NodeType == XmlNodeType.Element)
                {
                    xwriter.WriteStartElement(xreader.Name);
                    xwriter.WriteAttributes(xreader, false); //xreader의 현재 특성을 쓰기
                    if (xreader.IsEmptyElement)
                    {
                        xwriter.WriteEndElement();
                    }
                }
                else if (xreader.NodeType == XmlNodeType.EndElement)
                {
                    xwriter.WriteEndElement();
                }
            }
            xwriter.Close();
            xreader.Close();
            Console.WriteLine();            
        }
    }
}

 다음은 실행했을 때 만들어지는 “data.xml” 파일의 내용입니다.

<?xml version="1.0" encoding="utf-8"?>
<!--XmlWriter 개체로 특성 쓰기-->
<books>
  <book title="XML.NET" 가격="12000" />
  <book title="ADO.NET" 가격="15000" />
</books>
실행 화면