2011. 9. 14. 17:42

XML 을 이용한 방명록 만들기


혼히 XML(eXtensible Markup Language) 이란 확장 가능한 마크업(Markup)언어라고 말합니다. 개념을 정확히 이해하기 위해 Markup 언어와 확장 가능하다라는 의미가 있습니다.

* 마크업(markup)언어                                                   * 확장 가능(extensible)한 언어


XML 은 문서 자체에 대한 형식(schema)을 정의할수 있기 때문에, XML 문서를 이용한 데이터 교환이 가능합니다. 다른 데이터베이스 서버간에도 데이터를 교환할수 있게 된것입니다.

보안을 위해 만들어 놓은 방화벽(FireWall)이 설치된 곳에서도, 텍스트 기반으로 작성된 XML 문서는 특정 포트를 통해 쉽게 데이터를 주고 받을 수 있습니다.


ADO.NET으로 데이터 베이스를 연결해서 보여주었던 것처럼, XML 문서도 하나의 데이터베이스처럼 데이터를 다룰수 있습니다. XML 문서를 다루는 가장 간단한 방법은 XmlTextReader 객체와 XmlTextWriter 객체를 사용하는 것입니다
.


* XmlTextReader 객체                                                   * XmlTextWriter 객체



-----------------------------------------------------------------------------------------------


XML DOM
XML DOM 에서 XML 문서를 다루는 기본 단위는 XmlNode 객체 입니다.

속성                                        설명
Node Type                              노드 타입입니다.
                                             예) XmlNodeType.Element
Name/Value                            노드이름과 값입니다.
                                              예)Response.Write(node.Name + " " + node.Value);
Attributes                                 노드에 정의된 모든 속성 리스트를 가져옵니다.
ChildNodes                              노드의 모든 자식 노드 리스트를 가져옵니다.
HadChildNodes                        노드에 자식노드가 있는지 여부를 알려줍니다.
                                              예) XmlNode node = node.FirstChild;
FistChild                                  노드의 첫번째 자식 노드를 가져옵니다.
                                               예) XmlNode node = node.FirstChild;
NestSibling                              같은 레벨이 있는 다음 자식 노드를 가져옵니다.
                                              예)XmlNode node = node.NextSibling;


--------------------------------------------------------------------------------------------------------------

방명록
xml 페이지에 방명록 기재.

list.aspx
  <div>
           <table>
            <tr>
                <td style="width: 94px">
   <asp:Label id="Label5" runat="server" BorderWidth="2px" BackColor="#C0C0FF" BorderColor="#8080FF" Height="21px" Width="575px" Font-Bold="True">방명록</asp:Label></td>
            </tr>
            <tr>
                <td style="width: 94px">
   <asp:HyperLink id="lnkWrite" runat="server" NavigateUrl="write.aspx" ImageUrl="images\write.gif">쓰기 페이지로 이동합니다.</asp:HyperLink></td>
            </tr>
            <tr>
                <td style="width: 94px">
   
   <asp:DataList id="DataList1" runat="server" Width="580px" Height="20px" BorderColor="#DEBA84" BorderStyle="None" BackColor="#DEBA84" CellPadding="3" GridLines="Both" BorderWidth="1px" CellSpacing="2">
    <SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#738A9C"></SelectedItemStyle>
    <ItemStyle ForeColor="#8C4510" BackColor="#FFF7E7"></ItemStyle>
    
    <ItemTemplate>
     <img alt="" src="images\clip.jpg">
     <b> <%# Eval("title") %></b>
     <br> 방문이 : <%# Eval("name")%>
     (<a href='mailto:<%# Eval("email")%>'><%# Eval("email")%></a>)
     <br> 언제 : <%# Eval("date") %>
     <br> <%# DataBinder.Eval(Container.DataItem, "body") %>
    </ItemTemplate>
    
    <FooterStyle ForeColor="#8C4510" BackColor="#F7DFB5"></FooterStyle>
    <HeaderStyle Font-Bold="True" ForeColor="White" BackColor="#A55129"></HeaderStyle>
   </asp:DataList></td>
            </tr>
        </table>
    </div>


list.aspx.cs

using System.Xml;

public partial class list : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //xml 문서 읽기
        string fname = Server.MapPath(@"App_Data\GuestBook.xml");
        XmlDataDocument doc = new XmlDataDocument();

        try
        {
            // xml 데이터 읽기
            doc.DataSet.ReadXml(fname);
        }
        catch
        {
            Response.Write("보여줄 데이터가 없습니다.");
        }
        //데이터 소스 연결 및 데이터 바인딩
        DataList1.DataSource = doc.DataSet;
        DataList1.DataBind();
    }
}



write.aspx

    <div>
     <table>
            <tr>
                <td colspan="2">
   <asp:Label id="Label5" runat="server" Height="21px" Width="511px" BackColor="#C0C0FF" Font-Bold="True" BorderColor="#8080FF" BorderWidth="2px">방명록 쓰기</asp:Label></td>
            </tr>
            <tr>
                <td style="width: 100px">
   <asp:Label id="Label1" runat="server" >방문이 :</asp:Label></td>
                <td style="width: 100px">
   <asp:TextBox id="txtName" runat="server" Width="185px" ></asp:TextBox></td>
            </tr>
            <tr>
                <td style="width: 100px">
   <asp:Label id="Label4" runat="server" >메일 :</asp:Label></td>
                <td style="width: 100px">
   <asp:TextBox id="txtMail" runat="server" Width="183px" ></asp:TextBox></td>
            </tr>
            <tr>
                <td style="width: 100px">
   <asp:Label id="Label2" runat="server" >제목 :</asp:Label></td>
                <td style="width: 100px">
   <asp:TextBox id="txtTitle" runat="server" Width="402px" ></asp:TextBox></td>
            </tr>
            <tr>
                <td style="width: 100px">
   <asp:Label id="Label3" runat="server" >내용 :</asp:Label></td>
                <td style="width: 100px">
   <asp:TextBox id="txtBody" runat="server" Height="83px" Width="405px" TextMode="MultiLine"></asp:TextBox></td>
            </tr>
            <tr>
                <td style="width: 100px">
                    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<asp:ImageButton id="btnList"
                        runat="server" ImageUrl="images\list.gif" OnClick="btnList_Click"
                        style="height: 25px"></asp:ImageButton></td>
                <td style="width: 100px">
                    &nbsp;<asp:ImageButton id="btnSave" runat="server" ImageUrl="images\write.gif" OnClick="btnSave_Click"></asp:ImageButton></td>
            </tr>
        </table>
    </div>


write.aspx.cs


using System.Xml;

public partial class write : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
      
    }
    protected void btnList_Click(object sender, ImageClickEventArgs e)
    {
        Response.Redirect("list.aspx");
    }
    protected void btnSave_Click(object sender, ImageClickEventArgs e)
    {
        //1.xml 파일 열기
        string fname = Server.MapPath(@"App_Data\GuestBook.xml");
        XmlDocument doc = new XmlDocument();
        doc.Load(fname);

        //2.<guest> 노드를 생성하고, 루트 노드에 추가 합니다.
        XmlNode root = doc.DocumentElement;
        XmlNode node = doc.CreateElement("guest");
        root.AppendChild(node);

        // 자식노드추가

        //3.새로 추가한 <guest> 노드에 자식 (child)노드를 추가 합니다.
        XmlNode child;

        child = doc.CreateElement("name");
        child.InnerText = txtName.Text;
        node.AppendChild(child);

        child = doc.CreateElement("email");
        child.InnerText = txtName.Text;
        node.AppendChild(child);

        child = doc.CreateElement("date");
        child.InnerText = DateTime.Now.ToString();
        node.AppendChild(child);

        child = doc.CreateElement("tilte");
        child.InnerText = txtName.Text;
        node.AppendChild(child);

        //4.내용에 들어있는줄 바끔 문자를 <br> 로 바꾸어줍니다.
        string sbody = txtBody.Text;
        sbody = sbody.Replace("\n", "<br>");

        child = doc.CreateElement("body");
        child.InnerText = sbody;
        node.AppendChild(child);


        //5. xml 파일에 저장
        doc.Save(fname);
        doc = null;

        //6.리스페이지로 이동
        Response.Redirect("list.aspx");
    }
}


GuestBook.xml

<?xml version="1.0" encoding="utf-8"?>
<guests>
  <guest>
    <name>스카아</name>
    <email>sky@mail.com</email>
    <date>00/00/2011</date>
    <title>안녕~~</title>
    <body>반갑습니다.</body>
  </guest>
  <guest>
       <name>아</name>
    <email>아</email>
    <date>2011-09-14 오후 5:30:42</date>
    <tilte>아</tilte>
    <body>내용작성
&lt;br&gt;내용
&lt;br&gt;띄어쓰기
&lt;br&gt;내용.
&lt;br&gt;줄줄이
&lt;br&gt;내용.
&lt;br&gt;</body>
  </guest>
  <guest>
    <name>명록이</name>
    <email>명록이</email>
    <date>2011-09-14 오후 5:32:31</date>
    <tilte>명록이</tilte>
    <body>매뇬</body>
  </guest>
</guests>