Programming/.NET

 1. DataSet 과 XML

 

기본적으로 DataSet의 데이터를 XML로 표시하는건 간단합니다.

 

using (SqlConnection conn = new SqlConnection(con)) {
    SqlCommand cmd = new SqlCommand("Select * From BOOK;", conn);
    conn.Open();

    DataSet ds = new DataSet();
    ds.DataSetName = "books";
    ds.Load(cmd.ExecuteReader(), LoadOption.OverwriteChanges, "book");

    Response.ContentType = "text/xml";
    ds.WriteXml(Response.OutputStream);
}

 

DataSetName은 XML에 대응해 최상위노드에 해당합니다. 그리고 Load메소드의 마지막 인자로 전달한 book은 TableName을 지정하는 것인데 XML에서는 최상위노드 하위의 개별요소로 작용합니다. 그 다음 마지막에 WriteXml 메소드를 호출하여 DB로부터 읽어들인 Table개체를 XML로 표시하도록 하였습니다.

 

 2. XmlDataDocument

 

XmlDataDocument클래스는 DataSet클래스에서 작성된 XML에 대해 좀더 구체적이고 유연한 컨트롤방법을 제공하는 클래스입니다.

 

using (SqlConnection conn = new SqlConnection(con)) {
    SqlCommand cmd = new SqlCommand("Select * From BOOK;", conn);
    conn.Open();

    DataSet ds = new DataSet();
    ds.DataSetName = "books";
    ds.Load(cmd.ExecuteReader(), LoadOption.OverwriteChanges, "book");

    XmlDataDocument xdd = new XmlDataDocument(ds);
    XmlNodeList xnl = xdd.SelectNodes("//books/book/title");

    foreach (XmlNode xn in xnl)
        Response.Write(xn.InnerText + "<br />");
}

 

XmlDataDocument 클래스의 생성자로 DataSet을 넘겨주면 XmlDocument API로 DataSet의 XML접근을 가능하게 하며 인자로 넘겨준 DataSet을 기반으로한 XmlDataDocument의 DataSet을 제공하기도 합니다.

 

XmlDataDocument xdd = new XmlDataDocument(ds);
XmlNodeList xnl = xdd.SelectNodes("//books/book/title");

xdd.DataSet.EnforceConstraints = false;
foreach (XmlNode xn in xnl)
    xn.InnerText = "이건 제목";

foreach (DataRow dr in ds.Tables[0].Rows)
    Response.Write(dr[2].ToString() + "<br />");

 

이전 예제는 단순히 XML로 데이터를 불러와 보여주는데 그쳤지만 위 예제는 직접 XML의 데이터를 바꾸는 동작을 수행합니다. 이게 재미있는게 일단 DataSet을 통해 XmlDataDocument객체를 생성하면 해당 객체와 인자로 넘겨준 DataSet이 연결된다는 것입니다. 그래서 XML데이터를 바꾸면 그 값이 DataSet에도 그대로 반영됩니다. 다만 실제 데이터를 바꾸려면 XmlDataDocument클래스의 EnforceConstraints를 true로 설정해야 합니다.

 

xdd.DataSet.EnforceConstraints = false;
foreach (XmlNode xn in xnl) {
    xn.InnerText = "이건 제목";

    DataRow dr = xdd.GetRowFromElement((XmlElement)xn.ParentNode);
    Response.Write(dr[2].ToString() + "<br />");
}

 

변경된 데이터는 직접 DataSet 데이터를 순회하여 확인할 수 있고 아니면 XML노드를 다시 DataSet의 Row객체로 변환해 바로 보는것도 가능합니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] Calender  (0) 2016.03.07
[ASP.NET] DataList  (0) 2016.03.03
[ASP.NET] XML - 6  (0) 2016.02.23
[ASP.NET] XML - 5  (0) 2016.02.18
[ASP.NET] XML - 4  (0) 2016.02.11
[ASP.NET] XML - 3  (0) 2016.02.01
0 0