White Whale Studio

[WPF] XML 작성 및 자동 줄바꿈 옵션 적용하기. & XML-Linq 사용 본문

IT Engineering/.Net (WPF)

[WPF] XML 작성 및 자동 줄바꿈 옵션 적용하기. & XML-Linq 사용

glorymind 2013. 7. 25. 17:26
반응형

XML을 본의아니게 많이 쓰다보니 이런 저런 포스팅을 하게 되는 군요.

이번 포스팅에서는 WPF 코드 상에서 XML 파일로의 저장과 자동 줄바꿈 옵션 적용에 대해서 살펴보겠습니다.

 

...라고는 했는데 그닥 전문적이거나 효율적이지 않을 수 있습니다. -ㅅ-;;;

 

 

일단 XML 파일에 저장하는 부분입니다.

 

 

 

 

대충 감이 잡히시는지요??

sw는 파일 저장하는 부분

XmlDocument는 전체 XML 문서를 의미하고

XmlWriter가 중요한 부분입니다.

이 녀석이 StreamWriter를 통해 파일에 저장하는 거죠.

WriteStartDocument();를 통해서 작성을 시작합니다. 반대로 EndDocument는 종료를 하는 거겠죠?

WriteStartElement는 상위 노드 입니다. 괄호 안에는 해당 노드의 Name을 의미합니다.

WriteElementString 은 상위 노드 아래의 자식 노드인데요.

괄호 안의 내용은 좌측은 짐작하시다시피 노드의 Name, 우측은 InnerText를 의미합니다.

마찬가지로 Element를 닫아주어야하구요.

flush는 뭔지는 모르겠습니다만... 일단 같이 넣어서 사용합시다. 아마도 사용된 자원을 정리하는 부분으로 추측되네요.

 

  혹시 자식 노드의 자식 노드를 넣고자 하시는 분들은 코드를 작성해 보시면 아시겠지만

WriteStartElement(부모 노드) 다음에 또다시 다른이름을 가지는 WriteStartElement(자식노드)를 추가해주신뒤 WriteEndDocument()를 2번 닫아주시면 됩니다.

 

 

아무튼 그다음에 할일은! 저장된 파일에 대해서 깔끔하게 줄바꿈 및 정리를 해야하겠죠.

걍 저장하면 일렬로 아름답게 줄을 선 XML 파일을 확인하시고는 뒷목을 잡으실 수 있습니다.

그러지 않으려면 다음과 같이 코드를 바로 작성합니다. 위의 코드 바로 다음 작업으로 해주시면 됩니다.

 

                sw.Close(); // 스트림을 닫아주고
                reader = new XmlTextReader(SaveFilePath); // reader에서 다시 읽어오고
                XmlDocument xmldoc = new XmlDocument();

                doc.PreserveWhitespace = false; // 이 부분을 false로 해두셔야 줄바꿈 정리가 됩니다.
                doc.Load(reader); // XML 문서에서 해당 xml 파일의 내용을 읽어 온뒤
                reader.Close(); // Stream을 다시 닫아야 자원 사용에 대한 오류가 발생하지 않습니다.
                doc.Save(SaveFilePath); // 동일한 파일 경로에 xml을 저장합니다.

 

=============================================================================

 

XML-Linq를 사용한 XML 작성방법

 

사실 알게된지는 좀 됬는데 이제서야 수정된 포스팅을 하게 되는군요.

이 방법은 위의 방법보다는 보다 깔끔하고 이해하기가 쉬울 것 같습니다.

우선 using System.Xml.Linq;를 추가해주셔야지 정상적으로 작성이 가능합니다.

 

노드의 작성은 XElement로 수행합니다.

예를 들면

XElement root = new XElement("ROOT"); // 요렇게 하면 노드만 생성되고

XElement root = new XElement("ROOT", "Data") // 이렇게 하면 Root 노드에 Data라는 텍스트가 들어간 상태가 됩니다. 하위 노드를 넣고 싶다면

XElement root = new XElement("ROOT",

new XElement("Child", 1),

new XElement("Child2", 2)

);

와 같이 사용하거나

부모 노드만 우선 생성한 뒤에

root.Add(new XElement("Child3", 3)); 과 같이 추가를 하셔도 됩니다.

속성값은

                root = new XElement("Root",
                    new XAttribute("X", "10"),
                    new XAttribute("Y", "10"),
                    new XAttribute("Width", "1920"),
                    new XAttribute("Height", "1080"));

 

와 같이 사용하시면 됩니다. 이와 같은 방식이 위의 방법보다는 훨씬 편할 것같네요.

반응형
Comments