XML 문서의 수정은 단순 기존 속성이나 InnerText(컨텐츠) 값을 변경해주는 것이 있고,

엘리먼트를 바꿔주는것도 있다. 엘리먼트를 바꿔 줄때는 엘리먼트의 Name속성자체가

읽기 전용 속성이기 때문에 단순히 변경되지 않는다.

 

먼저 단순 값변경부터 알아 보겠다.

이건 뭐... 정리까지 해야하나 할 정도지만... 일단 간단하니 예제를 보자

 

예제

XmlDocument doc = new XmlDocument();
doc.Load(pathURI);

XmlElement booklist = doc.DocumentElement;
XmlElement fbook= booklist.FirstChild as XmlElement;
//책 제목 , 책 종류 수정
XmlElement fbookTitle= fbook.FirstChild as XmlElement;
//1) 제목 수정 innerText 속성 사용
fbookTitle.InnerText = "ASP";
//2) 종류 수정 : SetAttribute() 메서드 사용
fbook.SetAttribute("kind", "프로그램언어");
//저장
StringWriter sw = new StringWriter();
doc.Save(sw);

Console.WriteLine(sw.ToString());
sw.Close();

예제에서는 booklist의 첫번째 자식 book을 가져와서 그 book엘리먼트의 속성과 컨텐츠 내용을 바꾸는 예제 이다.

새로운 속성이나 메서드는 없다.

 

주석을 보면 알수있겠다. 예상대로 별거 없다. 가져온 엘리먼트의 InnerText속성을 사용해서 값을 다른 값으로 바꿔주고 SetAttribute()메서드를 이용해 해당 속성의 값을 다른 값으로 변경해 주었다. 바로 이전 정리에서 이 메서드는 새로운 엘리먼트의 새로운 속성을 만들어 줄 때도 사용하였다. 이처럼 기존에 있는 속성이름으로 다시 값을 셋팅해주면 덮어쓰기같이 값이 덮어써지기 때문에 마치 수정한것과 같은 결과를 가져온다.

콘솔창에 출력하는 방법인데 파일로 저장하는 방법은 앞에서 정리했으니 파일로 저장하고 싶으면 앞정리를 보면 되겠다.

 

 

 

 

결과출력

 

 

 

XmlDocument doc = new XmlDocument();
doc.Load(pathURI);

XmlElement eBooklist = doc.DocumentElement;
//마지막 book 엘리먼트를 eOldBook으로 저장.
XmlElement eOldBook = eBooklist.LastChild as XmlElement;
// 새로운 book엘리먼트 생성
XmlElement eNewBook = doc.CreateElement("책");
// Book 이라는 엘리먼트의 속성/자식 엘리먼트 추가
// 속성 복사
foreach (XmlAttribute attri in eOldBook.Attributes)
{
eNewBook.SetAttribute(attri.Name, attri.Value);
}
// 자식 복사
foreach (XmlElement eChild in eOldBook.ChildNodes)
{
eNewBook.AppendChild(eChild.CloneNode(true));
//true는 자식의 자식까지 복사하는것 false는 바로 밑에 자식들만 복사 하겠다.
}
//교체
eBooklist.ReplaceChild(eNewBook, eOldBook);
//
//저장
StringWriter sw = new StringWriter();
doc.Save(sw);//콘솔창에 결과 보기 위해 스트림형태로....
Console.WriteLine(sw.ToString());
sw.Close();

이 예제에서는 엘리먼트의 이름을 'book'에서 '책'으로 변경하려 한다. 하지만 앞에서 언급한 것과 같이 Name 속성 자체가 읽기 전용이므로 그렇게 되지 않는다. 그래서 새엘리먼트를 추가해서 원래 엘리먼트의 자식 노드들을 모두 복사해서 기존 엘리먼트와 새 엘리먼트를 교체해야한다.

방법)

먼저 수정이 될 대상을 booklist의 마지막 자식 book으로 정하고 eOldBook에 담아두었다. 그리고 새엘리먼트 이름을 '책'이라 하고 이름을 eNewBook이라 하였다. 속성을 복사에는 자주 봤던 SetAttribute()를 이용해 복사하였고(실은 덮어쓰기) 자식들을 복사할때는 CloneNode()메서드를이용 하였는데 매개변수 타입이 boolean형이다. true를 할 경우 깊숙한 곳의 자식까지 노드가 이동해서 해당 노드를 XmlNode타입으로 반환할 것이고, false로 하면 바로 밑의 자식들로만 접근하여 복사할 것이다.

모든 작업이 끝난후 ReplaceChild()메서드를 이용해서 교체를 한다.

 

결과출력

마지막 booklist의 4번째 자식 엘리먼트가 '책'으로 바뀐것을 확인 할 수 있다.

 

 

 

 

 

 

+ Recent posts