개발자 미니민의 개발스터디

[spring] XML 파싱, JSON 파싱 ⭐⭐

by mini_min
[spring] XML 파싱, JSON 파싱 ⭐⭐

 ✔️ XML 파싱, JSON 파싱

: XML 파일이 있다는 가정하에 진행

APISerializer 클래스를 만들어서 공공 API 등의 데이터/XML 과 JSON 문서를 String 형태로 받는 메소드 등을 만든다.

 

1) String 형태로 받기 : receiveToString

2) 공공 API 등의 XML 데이터를 String 형태의 JSON 으로 변환하여 받기 : receiveXmlToJson

 


1) String 형태로 받기 : receiveToString

 

: 긁어 오는 방법이다. (입력 스트림을 사용해서)

String result = null;

    HttpURLConnection conn = null;

    try {
        //긁어오는 방법  - 입력 스트림 써서. 

        conn = (HttpURLConnection) new URL(spec).openConnection();
        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
        StringBuilder sb = new StringBuilder();
        String s;
        while ((s = br.readLine()) != null) {
            sb.append(s);
        }
        result = sb.toString();
    } catch (Exception e) {
        logger.error(e.toString());

        throw e;
    } finally {
        if (conn != null) {
            try {
                conn.disconnect();
            } catch (Exception e2) {
            }
        }
    }

    return result;

 

 

2) 공공 API 등의 XML 데이터를 String 형태의 JSON 으로 변환하여 받기 : receiveXmlToJson

: 주어진 주소 spec 에서 receiveToString 메소드로 XML 을 긁어오고, 해당 XML을 JSON 으로 변환하여 받는다.

String result = null;

    try {
        String s = receiveToString(spec);
        /*
         * spec = 주소. 주소에서 receiveToString 메소드로 XML 을 긁어옴
         * 아래 코드 필요함.
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20210307</version>
        </dependency>
         */
        JSONObject job = XML.toJSONObject(s);
        result = job.toString();

    } catch (Exception e) {
        // logger.error(e.toString());
        throw e;
    }

    return result;

 


✔️ XML 문서를 파싱하여 Map에 저장

: XML 문서를 긁어와서 (파싱하여) Map 에 저장하는 메소드이다.

1) 먼저 주소를 읽어들인다. (바이트 스트림으로)

2) InputSource : XML 에 해당되는 내용을 쉽게 파싱할 수 있도록 만들어진 클래스이다.

 

Map<String, Object> map = new HashMap<>();

    InputStream is = null;
    try {
        List<User> list = new ArrayList<>();

        // InputSource : XML 엔티티의 단일 입력 소스
        // 먼저 주소 읽어들이기 ! is 는 바이트 스트림. 
        // 다른점은 InputSource 객체 
        // InputSource : XML 에 해당되는 내용을 쉽게 파싱할 수 있도록 만들어진 클래스 
        is = new URL(spec).openConnection().getInputStream();
        InputSource source = new InputSource(new InputStreamReader(is, "UTF-8"));


        // DOM Document를 생성하기 위하여 팩토리 생성
        // 돔을 만들어주는 전 단계가 FACTORY 다. 
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // factory.setIgnoringElementContentWhitespace(false);
                        // 각 태그와 다음 태그의 사이의 공백 및 개행 문자 등을 제거하지 않음

        // 팩토리로부터 Document 파서를 얻어내도록 한다.
        // 파싱을 할 수 있는 (잘라낼 수 있는) 파서를 얻어낸다.
        DocumentBuilder parser = factory.newDocumentBuilder();

        // Document DOM 파서로 하여금 입력받은 파일을 파싱하도록 요청한다.
        // 아까 소스를 파싱하여 돔을 생성한다. 
        Document xmlDoc = parser.parse(source);

/*
        // InputSource 클래스를 사용하지 않고 commons-io 패키지 IOUtils 클래스사용 하는 경우 (commons-io - 아파치꺼)
        is = new URL(spec).openConnection().getInputStream();
        is = IOUtils.toInputStream(IOUtils.toString(is, "UTF-8"), "UTF-8");

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder parser = factory.newDocumentBuilder();
        Document xmlDoc = parser.parse(is);
*/

        // Element : XML 문서의 원소를 표현하기 위해 사용

        Element root = xmlDoc.getDocumentElement(); // XML 루트 요소

        // 자바스크립트처럼 가져올 때 태그 이름으로 가져옴
        // 데이터카운트 의 node 를 가져옴
        // 노드의 값을 가져올 때 getFirstChild().getNodeValue();
        Node nodeCount = root.getElementsByTagName("dataCount").item(0);
        String dataCount = nodeCount.getFirstChild().getNodeValue();

        // 여러개의 노드 리스트
        NodeList items = root.getElementsByTagName("record");
        for (int i = 0; i < items.getLength(); i++) {
            Node item = items.item(i);
            //자식들을 또 노트 리스트로 가져오기 
            NodeList itemList = item.getChildNodes();

            // 속성값 가져오기
            // 속성값에서 다시 num 값을 찾는다. 
            //  NamedNodeMap itemMap = item.getAttributes(); : 아이템에 들어있는 모든 속성의 모음
            NamedNodeMap itemMap = item.getAttributes();
            String num = itemMap.getNamedItem("num").getNodeValue();

            //itemList : 이름, 값 등의 데이터 
            User user = new User();
            user.setNum(Integer.parseInt(num));
            for (int j = 0; j < itemList.getLength(); j++) {
                Node e = itemList.item(j);

                // 이름, 값 가져오기
                if (e.getNodeType() == Node.ELEMENT_NODE) {
                    String name = e.getNodeName();
                    String value = e.getChildNodes().item(0).getNodeValue();

                    //값 넣어주기
                    if (name.equals("name")) {
                        user.setName(value);
                    } else if (name.equals("content")) {
                        user.setContent(value);
                    } else if (name.equals("created")) {
                        user.setCreated(value);
                    }
                }
            }

            list.add(user);
        }

        map.put("dataCount", dataCount);
        map.put("list", list);

    } catch (Exception e) {
        System.out.println(e.toString());
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (Exception e2) {
            }
        }
    }

    return map;
}

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기