본문 바로가기

Dev/Spring Boot

Java로 문자열 xml 파일 파싱

728x90

xml 형태이지만 문자열로 저장된 코드에서 원하는 값을 파싱해 사용해야하는 상황이 발생했다.

                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                Document document = builder.parse(new InputSource(new StringReader(xml.toString())));

                document.getDocumentElement().normalize();

                NodeList tagList = document.getElementsByTagName("trkpt");

Java의 표준 XML 파싱 API인 DOM (Document Object Model) Parser를 사용하여 XML 문서를 파싱하기 위한 DocumentBuilderFactory 인스턴스를 생성하는 코드입니다. 이를 단계별로 해석하면 다음과 같습니다.

  1. DocumentBuilderFactory
    DocumentBuilderFactory는 XML 문서를 파싱하는 데 필요한 DocumentBuilder 객체를 생성하는 팩토리 클래스입니다.
    XML을 파싱하려면 먼저 DocumentBuilderFactory를 통해 DocumentBuilder 객체를 얻어야 하며, 이를 통해 XML 문서를 Document 객체로 변환할 수 있습니다.
    DocumentBuilderFactory는 추상 클래스이므로 직접 객체를 생성할 수 없고, 대신 팩토리 메서드인 newInstance()를 사용해 적절한 구현 객체를 반환받습니다.
  2. newInstance()
    DocumentBuilderFactory.newInstance()는 현재 환경에서 사용할 수 있는 XML 파서의 구체적인 구현을 반환하는 정적 팩토리 메서드입니다.
    이 메서드는 자바 XML 파싱 라이브러리 내부에서 기본적으로 설정된 구현체 (예: Xerces)를 반환하거나, JVM의 환경 설정에 따라 다르게 동작할 수 있습니다.
    전체 흐름
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  • 이를 통해 XML 파서를 위한 팩토리 객체를 준비하게 됩니다.이후 이 팩토리 객체를 사용하여 DocumentBuilder를 생성하고, XML 파일을 파싱해 Document 객체로 변환합니다. 그리고 DocumentBuilder는 XML 문서를 읽고, DOM 객체 트리로 변환하는 데 사용됩니다.
  • builder.parse(...) 메서드는 주어진 XML 문자열을 파싱하여 Document 객체를 생성합니다. InputSource는 XML 데이터를 읽기 위한 소스이며, StringReader를 사용하여 문자열 형태의 XML 데이터를 제공합니다.
  • normalize() 메서드는 문서의 구조를 정리하여 텍스트 노드의 통합 및 노드의 정규화를 수행합니다. 이를 통해 XML 문서의 구조가 일관되게 유지됩니다.
  • getElementsByTagName("trkpt") 메서드는 XML 문서에서 모든 태그를 찾아 NodeList 형태로 반환합니다. 이 NodeList는 찾은 노드들을 포함하고 있으며, 이후 이 리스트를 통해 각 태그에 접근할 수 있습니다.

normalize() 메서드를 호출하지 않으면, XML 문서의 구조가 불완전할 수 있으며 다음과 같은 문제가 발생할 수 있습니다:

  • 중복 텍스트 노드:
    • 같은 부모 노드 아래에 있는 텍스트 노드가 여러 개 존재할 수 있습니다. 예를 들어, XML 요소 내에 연속된 텍스트 노드가 있을 경우, 이들 텍스트가 분리된 상태로 유지됩니다.
  • DOM 트리의 불일치:
    • XML 문서에서 요소가 중첩되어 있을 때, 노드 구조가 불일치하게 되어 DOM 트리 탐색 시 예기치 않은 결과를 초래할 수 있습니다.
  • 탐색 및 검색의 어려움:
    • DOM 트리를 탐색하거나 특정 노드를 찾을 때, 중복된 노드나 불완전한 구조로 인해 원하는 노드를 찾는 데 더 많은 복잡성이 생길 수 있습니다.
  • 불필요한 복잡성:
    • 코드가 복잡해지고, 오류가 발생할 가능성이 높아집니다. 데이터 처리 시 예기치 않은 동작이 발생할 수 있습니다.

결론적으로, normalize() 메서드를 호출하여 문서의 구조를 정리하면, XML 데이터를 일관성 있게 다룰 수 있어 코드의 안정성과 가독성이 향상됩니다.