[XML.NET] 25. XmlDocument 클래스로 노드 검색 및 삭제

 특정 노드의 특정 자식 노드를 제거할 때는 XmlNode의 RemoveChild 메서드를 사용합니다.

public XmlNode RemoveChild ( XmlNode node);

 특정 노드의 모든 자식과 특성을 제거할 때는 XmlNode의 RemoveAll 메서드를 사용합니다.

public void RemoveAll ( );

 특성 컬렉션에서 특정 특성을 제거할 때는 특성 컬렉션의 Remove 메서드를 사용합니다.

public XmlAttribute Remove ( );

 특성 컬렉션에서 모든 특성을 제거할 때는 특성 컬렉션의 RemoveAll 메서드를 사용합니다.

public void RemoveAll ( );

 특성 컬렉션에서 특정 인덱스의 특성을 제거할 때는 특성 컬렉션의 RemoveAt 메서드를 사용합니다.

public XmlAttribute RemoveAt ( int i);

 특정 요소의 특성 컬렉션을 제거할 때는 XmlElement 개체의 RemoveAllAttributes를 사용합니다.

public void RemoveAllAttributes ( );

 특정 요소의 특성을 이름으로 제거할 때는 XmlElement 개체의 RemoveAttribute 메서드를 사용합니다.

public void RemoveAttribute ( string name);
public void RemoveAttribute ( string name, string ns);

 특정 요소의 특성을 인덱스로 제거할 때는 XmlElement 개체의 RemoveAttributeAt 메서드를 사용합니다.

public XmlNode RemoveAttributeAt ( int i);

 검색 조건과 일치하는 첫 번째 노드를 선택할 때 XmlNode의 SelectSingleNode 메서드를 사용합니다.

public XmlNode SelectSingleNode ( string xpath);
public XmlNode SelectSingleNode ( string xpath, XmlNamespaceManager nsmg);

 검색 조건과 일치하는 노드의 목록을 선택할 때 XmlNode의 SelectNodes 메서드를 사용합니다.

public XmlNodeList SelectNodes ( string xpath);
public XmlNodeList SelectNodes ( string xpath, XmlNamespaceManager nsmg);

 다음은 앞에서 설명한 내용을 정리한 소스 코드입니다.

using System;
using System.Xml;

namespace 예제_노드_제거하기
{
    class Tracer
    {
        XmlDocument doc;
        public void MakeDocument()
        {
            doc = new XmlDocument();
            XmlDeclaration xmldecl;
            xmldecl = doc.CreateXmlDeclaration("1.0", null, null);
            doc.InsertBefore(xmldecl, doc.DocumentElement);

            XmlElement root = doc.CreateElement("books");
            doc.AppendChild(root);
            XmlElement elem = doc.CreateElement("book");
            elem.InnerText = "XML.NET";
            doc.DocumentElement.AppendChild(elem);
            elem.SetAttribute("price", "12000");
            XmlAttribute attr = doc.CreateAttribute("count");
            attr.Value = "50";
            elem.Attributes.Append(attr);
            XmlElement elem2 = doc.CreateElement("book");
            elem2.InnerText = "ADO.NET";
            doc.DocumentElement.AppendChild(elem2);
        }
        public void Trace()
        {
            TestXmlNode_RemoveChild();
            TestXmlNode_RemoveAll();
            TestAttributes_Remove();
            TestAttributes_RemoveAll();
            TestAttributes_RemoveAt();
            TestElement_RemoveAllAttributes();
            TestElement_RemoveAttribute();
            TestElement_RemoveAttributeAt();            
        }

        private void TestElement_RemoveAttributeAt()
        {
            Console.WriteLine("---Start TestElement_RemoveAttributeAt---");
            MakeDocument();
            XmlNode pnode = doc.SelectSingleNode("books");
            XmlNode cnode = pnode.ChildNodes[0];
            XmlElement xelem = cnode as XmlElement;
            if (xelem != null)
            {
                xelem.RemoveAttributeAt(0);
            }
            
            doc.Save(Console.Out);
            Console.WriteLine();
            Console.WriteLine("---End TestElement_RemoveAttributeAt---");
        }

        private void TestElement_RemoveAttribute()
        {
            Console.WriteLine("---Start TestElement_RemoveAttribute---");
            MakeDocument();
            XmlNode pnode = doc.SelectSingleNode("books");
            XmlNode cnode = pnode.ChildNodes[0];
            XmlElement xelem = cnode as XmlElement;
            if (xelem != null)
            {
                xelem.RemoveAttribute("price");
            }

            doc.Save(Console.Out);
            Console.WriteLine();
            Console.WriteLine("---End TestElement_RemoveAttribute---");
        }

        private void TestElement_RemoveAllAttributes()
        {
            Console.WriteLine("---Start TestElement_RemoveAllAttributes---");
            MakeDocument();
            XmlNode pnode = doc.SelectSingleNode("books");
            XmlNode cnode = pnode.ChildNodes[0];
            XmlElement xelem = cnode as XmlElement;
            if (xelem != null)
            {
                xelem.RemoveAllAttributes();
            }

            doc.Save(Console.Out);
            Console.WriteLine();
            Console.WriteLine("---End TestElement_RemoveAllAttributes---");
        }        

        private void TestAttributes_RemoveAt()
        {
            Console.WriteLine("---Start TestAttributes_RemoveAt---");
            MakeDocument();
            XmlNode pnode = doc.SelectSingleNode("books");
            XmlNode cnode = pnode.ChildNodes[0];
            XmlAttributeCollection col = cnode.Attributes;
            col.RemoveAt(0);
            doc.Save(Console.Out);
            Console.WriteLine();
            Console.WriteLine("---End TestAttributes_RemoveAt---");
        }

        private void TestAttributes_RemoveAll()
        {
            Console.WriteLine("---Start TestAttributes_RemoveAll---");
            MakeDocument();
            XmlNode pnode = doc.SelectSingleNode("books");
            XmlNode cnode = pnode.ChildNodes[0];
            XmlAttributeCollection col = cnode.Attributes;
            col.RemoveAll();
            doc.Save(Console.Out);
            Console.WriteLine();
            Console.WriteLine("---End TestAttributes_RemoveAll---");
        }

        private void TestAttributes_Remove()
        {
            Console.WriteLine("---Start TestAttributes_Remove---");
            MakeDocument();
            XmlNode pnode = doc.SelectSingleNode("books");
            XmlNode cnode = pnode.ChildNodes[0];
            XmlAttributeCollection col = cnode.Attributes;
            XmlAttribute attr = col["price"];
            col.Remove(attr);
            doc.Save(Console.Out);
            Console.WriteLine();
            Console.WriteLine("---End TestAttributes_Remove---");
        }

        private void TestXmlNode_RemoveAll()
        {
            Console.WriteLine("---Start TestXmlNode_RemoveAll---");
            MakeDocument();            
            XmlNode pnode = doc.SelectSingleNode("books");            
            pnode.RemoveAll();
            doc.Save(Console.Out);
            Console.WriteLine();
            Console.WriteLine("---End TestXmlNode_RemoveAll---");
        }

        private void TestXmlNode_RemoveChild()
        {
            Console.WriteLine("---Start TestXmlNode_RemoveChild---");
            MakeDocument();
            XmlNode pnode = doc.SelectSingleNode("books");
            XmlNode cnode = pnode.ChildNodes[0];
            pnode.RemoveChild(cnode);
            doc.Save(Console.Out);
            Console.WriteLine();
            Console.WriteLine("---End TestXmlNode_RemoveChild---");       
        }
        
    }
    class Program
    {
        static void Main(string[] args)
        {
            Tracer tracer = new Tracer();
            tracer.Trace();
        }
    }
}
실행결과