VB.NET XML 파싱 - XmlDocument 사용

2024. 2. 21. 15:41VB.NET/왕초보

 

 

VB.NET HTML 파싱 - XPath를 사용한 HtmlAgilityPack 예제

VB.NET으로 HTML을 파싱하기 위해 예전에는 InStr, Mid, Left 등을 이용해서 하나하나 위치 잡아서 값을 가져왔던 기억이 나는데, 이제는 그럴 필요가 없다. 물론 예전 방식으로 작업해도 동작에 무리가

chakhani.tistory.com

지난 시간 HTML 파싱에 이어 이번 시간에는 XML 파싱에 대해 알아보자. XML 파싱은 VB.NET에서 기본 제공하는 기능이라 NuGet 패키지를 별도로 설치할 필요는 없다.

 

예제를 설명하기 위해 아이디, 이름, 점수를 나타내는 간략한 XML 문서를 하나 만들자.

<?xml version="1.0" encoding="UTF-8" ?>
<Student>
   <Info>
      <Id>user1</Id>
      <Name>홍길동</Name>
      <Score>80</Score>
   </Info>
   <Info>
      <Id>user2</Id>
      <Name>이순신</Name>
      <Score>90</Score>
   </Info>
   <Info>
      <Id>user3</Id>
      <Name>김철수</Name>
      <Score>100</Score>
   </Info>
</Student>

 

이제 위 XML 문서를 파싱해보자. XML 파싱에서는 SelectNodes와 SelectSingleNode만 알면 웬만한 XML은 다 파싱이 가능하다.

 

우선 각 정보를 담을 구조체를 하나 선언하자.

Private Structure USER_INFO
   Dim UserID As String
   Dim UserName As String
   Dim UserScore As Integer
End Structure

 

XML 문서에서 구하려고 하는 값을 의미하는 구조로 만들어주면 된다.

 

반응형

 

이제 아래 소스를 통해 XML을 파싱해보자.

Private Function ParseXML(pSrc As String) As List(Of USER_INFO)
    Dim lpItem As USER_INFO, lpList As New List(Of USER_INFO)

    Dim lpXMLDoc As New Xml.XmlDocument
    lpXMLDoc.LoadXml(pSrc)

    Dim lpInfoList As XmlNodeList = lpXMLDoc.SelectNodes("/Student/Info")
    For Each lpNode As Xml.XmlNode In lpInfoList
        lpItem.UserID = lpNode.SelectSingleNode("Id").InnerText
        lpItem.UserName = lpNode.SelectSingleNode("Name").InnerText
        lpItem.UserScore = Val(lpNode.SelectSingleNode("Score").InnerText)
        lpList.Add(lpItem)
    Next

    Return lpList
End Function

 

1. 파라미터로 받아온 XML 문서를 XmlDocument를 통해 읽어온다.

Dim lpXMLDoc As New Xml.XmlDocument
lpXMLDoc.LoadXml(pSrc)

2. XML에서 사용자별로 반복되는 <Info> 태그의 목록을 구한다.

Dim lpInfoList As XmlNodeList = lpXMLDoc.SelectNodes("/Student/Info")


여기서 SelectNodes의 파라미터로 XML 문서의 절대경로가 사용되었다는 것에 주목하자. 문서를 lpXMLDoc에 넣으면 루트폴더가 Student이니 이 파라미터에서 맨앞에 슬래시를 빼고 상대주소인 "Student/Info"로 적어줘도 결과는 동일하다.

3. 이 목록을 루프 돌며 각 사용자의 정보를 리스트에 넣는다.

For Each lpNode As Xml.XmlNode In lpInfoList
   lpItem.UserID = lpNode.SelectSingleNode("Id").InnerText
   lpItem.UserName = lpNode.SelectSingleNode("Name").InnerText
   lpItem.UserScore = Val(lpNode.SelectSingleNode("Score").InnerText)
   lpList.Add(lpItem)
Next

 

이 루프를 돌면서 lpNode에는 <Info>...</Info>가 하나씩 들어가게 되니, <Info>의 하위 노드인 Id, Name, Score의 InnerText를 가져와서 변수에 넣어주고, 최종적으로 이 구조체 값을 리스트에 넣으면 되는 것이다.

마치며...

이처럼 XML 파싱은 비교적 간단하게 처리할 수 있다. 요즘은 XML 보다는 Json을 사용하는 추세이니 아래 Json 파싱 강좌도 한번 읽어보길 바란다.

 

 

 

[VB.NET 2022] JSON Parsing - JSON을 파싱해보자.

JSON을 파싱하는건 예전 VB6 시절에는 상당히 번거로운 일이었다. 그냥 문서의 처음부터 루프를 돌며 하나씩 분리해서 이름과 값을 직접 때려넣어야 가능한 일이었으니 말이다. 예를 들어 아래 정

chakhani.tistory.com

 

반응형