[C#] XML를 XPath를 이용해서 다루는 방법


Development note/C#  2019. 8. 2. 23:37

안녕하세요. 명월입니다.


이 글은 C#에서 XML를 XPath를 이용해서 다루는 방법에 대한 글입니다.


이전에 XML를 CssSelector 엔진(Sizzle)처럼 요소를 통해 검색하는 방법과 XML Reader 와 Writer를 이용하여 다루는 방법을 소개한 적이 있습니다.


링크 - [C# 강좌 - 30] XML 다루기 (1) - Reader

링크 - [C# 강좌 - 31] XML 다루기 (2) - Writer

링크 - [C#] NSoup 라이브러리 (XML, HTML 파서)


사실 Reader와 Writer로 사용하는 방법은 정말 예전에 사용하는 방법이고 최근에는 NSoup를 통해서 데이터를 취득하는게 일반적입니다. 그리고 이 XPath의 경우는 이 NSoup 라이브러리가 활성되기 전에 XML를 다루는 일반적인 방법이었습니다.

그렇다고 해서 예전 방식은 전혀 사용하지 않고 모든 것을 NSoup로 사용하는 것아니고 상황에 따라 Reader와 Writer를 사용합니다.


예를 들면 하나의 XML의 값을 찾고 추적한다면 NSoup의 방식이 효율적이고 빠릅니다. 그러나 XML 전체의 데이터를 구조화하고 클래스로 변환하려면 역시 Reader를 사용하거나 좀 더 명학한 룰을 정하고 싶으면 XPath를 이용하는 것이 좋습니다.

먼저 XPath에 대해서 알아야 할 필요가 있는데 XPath는 XML를 형식을 디렉토리 표현식(?)으로 나타내어 데이터를 탐색하는 것입니다.


XPath는 크게 어렵지는 않습니다만 언제 기회가 되면 다루어 이것도 다루어 봐야겠네요.


먼저 XPath로 탐색하기 위한 XML를 예제를 구하겠습니다.

예제로는 제가 현재 티스토리 블로그를 이용하고 있으니 티스토리의 RSS를 이용해서 테스트를 해보면 되겠네요.

예제 링크 - http://nowonbun.tistory.com/rss


위 예제에서 channel 태그 밑의 item에서 title값만 추출하겠습니다.

using System;
using System.Text;
using System.Xml;
namespace Example
{
  class Program
  {
    static void Main(string[] args)
    {
      XmlDocument xmlDoc = new XmlDocument();
      // 티스토리 rss를 로드한다.
      xmlDoc.Load("https://nowonbun.tistory.com/rss");
      // XPath로 NodeList를 취득한다. XPath는 rss 태그 밑에 channel 밑의 item 태그
      XmlNodeList itemNodes = xmlDoc.SelectNodes("//rss/channel/item");
      foreach (XmlNode itemNode in itemNodes)
      {
        // //rss/channel/item의 title 태그를 취득한다.
        XmlNode titleNode = itemNode.SelectSingleNode("title");
        Console.WriteLine(titleNode.InnerText);
      }

      Console.WriteLine("Press any key...");
      Console.ReadKey();
    }
  }
}

콘솔을 보면 xml에서 title 내용만 추출해서 console에 출력했습니다.

제가 이 XmlDocument로 html파일도 읽어보려 했는데 형식에 맞지 않는다는 에러가 발생하네요.

아마 html의 형식은 해결되지 않는 듯 싶습니다. html은 NSoup 라이브러리를 이용해서 데이터를 취득 해야 하겠습니다.


여기까지 C#에서 XML를 XPath를 이용해서 다루는 방법에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.