반응형

내 목표는 
보다 깨어 있고 활기차고 
생기 넘치는 삶을 사는 것이다. 
어느 한순간도 놓치지 않고 온전하게 
인식하고 경험할 수 있기를 기도한다. 
그런 삶을 살기 위해서는 
수행을 해야 한다. 

- 오프라 윈프리의《위즈덤》중에서 - 


* 어느 한순간도 
놓치지 않는 것, 쉽지 않습니다.
그러려면 늘 깨어있어야 하고, 명료해야 하고,
지치지 않아야 하고, 심신이 건강해야 합니다.
오프라뿐 아니라 만인이 바라는 것입니다.
실천이 문제입니다.

반응형

'생활의 발견 > 아침편지' 카테고리의 다른 글

잔병치레  (0) 2019.07.05
'자기 완성'  (0) 2019.07.04
일관(一貫)  (0) 2019.07.02
7월의 숲  (0) 2019.07.01
표정의 양식  (0) 2019.06.29
반응형

Java XML parse Library (=XPath)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
 
public class OpenApi {
    public static void main(String[] args) {
        BufferedReader br = null;
        //DocumentBuilderFactory 생성
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder;
        Document doc = null;
        try {
            //OpenApi호출
            String urlstr = "http://openapi.airkorea.or.kr/"
                    + "openapi/services/rest/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty"
                    + "?stationName=수내동&dataTerm=month&pageNo=1&numOfRows=10&ServiceKey=서비스키&ver=1.3";
            URL url = new URL(urlstr);
            HttpURLConnection urlconnection = (HttpURLConnection) url.openConnection();
            
            //응답 읽기
            br = new BufferedReader(new InputStreamReader(urlconnection.getInputStream(), "UTF-8"));
            String result = "";
            String line;
            while ((line = br.readLine()) != null) {
                result = result + line.trim();// result = URL로 XML을 읽은 값
            }
            
            // xml 파싱하기
            InputSource is = new InputSource(new StringReader(result));
            builder = factory.newDocumentBuilder();
            doc = builder.parse(is);
            XPathFactory xpathFactory = XPathFactory.newInstance();
            XPath xpath = xpathFactory.newXPath();
            // XPathExpression expr = xpath.compile("/response/body/items/item");
            XPathExpression expr = xpath.compile("//items/item");
            NodeList nodeList = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
            for (int i = 0; i < nodeList.getLength(); i++) {
                NodeList child = nodeList.item(i).getChildNodes();
                for (int j = 0; j < child.getLength(); j++) {
                    Node node = child.item(j);
                    System.out.println("현재 노드 이름 : " + node.getNodeName());
                    System.out.println("현재 노드 타입 : " + node.getNodeType());
                    System.out.println("현재 노드 값 : " + node.getTextContent());
                    System.out.println("현재 노드 네임스페이스 : " + node.getPrefix());
                    System.out.println("현재 노드의 다음 노드 : " + node.getNextSibling());
                    System.out.println("");
                }
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

 

1. XML이 제공되는 URL로 접속해서 데이터를 받아온다.

2. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance()로 factory를 생성한다.

3. DocumentBuilder builder = factory.newDocumentBuilder();로 builder를 생성한다.

4. InputSource is = new InputSource(new StringReader( 1.에서 받은 xml문자열 )); 로 InputSource를 생성한다.

  - XML파일에서 받는거면 InputSource is = new InputSource(new FileReader( File객체 ));로 생성한다.

5. Document doc = builder.parse(is); 로 XML을 파싱한다.

6. XPath xpath = XPathFactory.newInstance().newXPath(); 로 XPath 객체를 생성하고

7. XpathExpression expr = xpath.complie( 선택하는 문법 ); 으로 가져올 element를 선택한다.

8. 해당 노드(Element)에 접근해서 필요한 데이터를 추출한다.

 

대략적으로 위와 같은 과정으로 XML데이터 파싱이 이루어진다.

 DocumentBuilderFactory로부터 builder를 만들어내고 InputSource에 XML을 넣어서 document를 만드는 것까지는 일반적이다.

여기서 XML을 파싱해서 새롭게 만들어진 DOM객체를 접근하는데에 XPath가 쓰인다.

중점적으로 봐야할 부분은 역시 XPath의 문법이다. XPath는 노드에 접근하는데에 표현식(XPathExpression)이 사용된다.

다른 블로그에서 Xpath 표현식 문법(?)에 대해 잘 정리한 곳이 많으므로 여기서는 자주 쓰이고 중요한 부분만 정리한다.


 

 XPathExpression

표현식까지 익혀야 한다고 번거로운 라이브러리라고 판단할 수도 있겠지만 한 번 익혀두거나 나중에 찾아보면서 사용해도 훌륭한 것 같은 라이브러리니 간단하게 배운다.

item : <item>요소를 모두 선택함
/item : "/" 루트 노드의 자식 노드중에서 <item>엘리먼트를 선택함 (앞에 "/"가 들어가면 절대 경로)
item/jeongpro : <item>엘리먼트의 자식 노드중에서 <jeongpro>엘리먼트를 선택 (상대 경로)
// : 현재 노드의 위치와 상관없이 지정된 노드부터 탐색
//item : 위치와 상관없이 엘리먼트 이름이 <item>인 모든 엘리먼트
item/@id : 모든 <item>엘리먼트의 id속성 노드를 모두 선택함
item[k] : <item>엘리먼트 중에서 k번 째 <item>엘리먼트
item[@attr = val] : attr이라는 속성이 val값을 가지는 모든 <item>엘리먼트

 

이런 표현식들이 있으니 잘 사용하면된다. 위의 예제에서는 //items/item 이라는 표현식을 적었으므로 "위치와 상관없이 <items>라는 노드들 중에서 자식 노드가 <item>인 노드(element)들을 NodeList로 받았다.

결과적으로 파싱을 마친 후 노드에서 원하는 데이터를 정확하게 추출하는 것이 중요하다.

node.getNodeName() 으로 "element 이름"을 받았고

node.getTextContent() 로 "값"을 받았다. (* 참고로 getNodeValue()가 있는데 혼란을 겪지 않길 바란다.)

또한 node.getPrefix() 로 "네임스페이스 값"을 받을 수도 있고

node.getNextSibling으로 "다음 노드"를 선택할 수도 있다.

속성은 node.getAttributes().item(0) 이런식으로 받을 수 있다.

끝으로 문자열에서 xml 파싱하는 소스도 첨부한다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
 
public class OpenApi {
    public static void main(String[] args) {
        //DocumentBuilderFactory 생성
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder;
        Document doc = null;
        try {
            // xml 파싱하기
            String result = "<response xmlns:s='http://www.example.net/'><items><item><s:best>hello</s:best></item></items></response>";
            InputSource is = new InputSource(new StringReader(result));
            builder = factory.newDocumentBuilder();
            doc = builder.parse(is);
            XPathFactory xpathFactory = XPathFactory.newInstance();
            XPath xpath = xpathFactory.newXPath();
            // XPathExpression expr = xpath.compile("/response/body/items/item");
            XPathExpression expr = xpath.compile("//items/item");
            NodeList nodeList = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
            for (int i = 0; i < nodeList.getLength(); i++) {
                NodeList child = nodeList.item(i).getChildNodes();
                for (int j = 0; j < child.getLength(); j++) {
                    Node node = child.item(j);
                    System.out.println("현재 노드 이름 : " + node.getNodeName());
                    System.out.println("현재 노드 이름 : " + node.getLocalName());
                    System.out.println("현재 노드 타입 : " + node.getNodeType());
                    System.out.println("현재 노드 값 : " + node.getTextContent());
                    System.out.println("현재 노드 네임스페이스 : " + node.getPrefix());
                    System.out.println("현재 노드의 다음 노드 : " + node.getAttributes().item(0));
                    System.out.println("");
                }
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
 

 https://jeong-pro.tistory.com/144

 

자바 XML 파싱 라이브러리, XPath를 사용한 예제와 정확하게 element를 선택하는 방법을 알아보자

Java XML parse Library (=XPath) XPath : 자바에서 내장 패키지(javax.xml.xpath)로 제공하는 라이브러리로 XML형식의 웹문서, 파일, 문자열을 파싱하는데 사용한다. 요즘 누가 XML쓰나? JSON이랑 비교했을 때 태..

jeong-pro.tistory.com

 

반응형
반응형
제주, 일상
#어린이집 #등원 #제주 #해솔이

반응형

'육아일기' 카테고리의 다른 글

2019-07-16 제주, 육아  (0) 2019.07.17
2019-07-04 어린이집 가기 좋은 날씨다!  (0) 2019.07.04
2019-07-01 제주, 육아  (0) 2019.07.01
해솔이 분신술  (0) 2019.06.27
2019-06-25 제주,육아  (0) 2019.06.25
반응형

베푸는 것은 어디서 주든지, 얼마를 주든지, 무엇을 주든지
손해를 보지 않는다.
먼저 주고, 항상 주고, 없는데 주어야한다.
- 강희목 선생 (후천개벽 사상가) 

“내 인생에서 가장 소중한 시간은 지금 이 시간이요.
내 인생에서 가장 소중한 사람은 지금 만나는 사람이요.
내 인생에서 가장 소중한 일은 지금 만나는 사람에게
기쁨과 평화와 웃음을 주는 일이다.”
먼저 항상 주는 것을 생각하는데서 행복이 함께 합니다

반응형
반응형

'일관一貫'이라는 말은 
처음부터 끝까지 한결같다는 뜻이다. 
처음과 끝을 꿰뚫어 하나로 꿴다는 뜻이다. 
하나의 생각, 하나의 의지, 하나의 원리로 꿴다는 
뜻이다. 이렇게 뜻을 새겨본다면 이 말은 
수심修心의 차원에 있기도 하다. 
일심一心을 생각하게 
하는 것이다. 

- 문태준의《바람이 불면 바람이 부는 나무가 되지요》중에서 -


* 일관은 신뢰를 요구합니다.
신뢰해야 끝까지 갈 수 있습니다.
처음부터 끝까지 믿고 함께 할 수 있는 사람에게
모든 것을 걸 수 있고 일심(一心)을 나눌 수 있습니다.
믿고 일할 수 있고, 믿고 사랑할 수 있습니다.
한마음이 될 수 있습니다.

반응형

'생활의 발견 > 아침편지' 카테고리의 다른 글

'자기 완성'  (0) 2019.07.04
오프라 윈프리의 '인생 목표'  (0) 2019.07.03
7월의 숲  (0) 2019.07.01
표정의 양식  (0) 2019.06.29
열렬한 애정, 그리고 열정  (0) 2019.06.28
반응형

Youtube 반복재생 안될때. 

< iframe width="560" height="315" src="https://www.youtube.com/embed/vn6b2gj4EVc?rel=0&autoplay=1&modestbranding=1&loop=1&showinfo=0;playlist=vn6b2gj4EVc"

에서 마지막에 playlist= 에 동영상 코드를 동일하게 넣어주어라. 

그리고, rel= autoplay= 순서 바꾸지 말고. 

 

<iframe width="560" height="315" src="https://www.youtube.com/embed/vn6b2gj4EVc?rel=0&autoplay=1&modestbranding=1&loop=1&showinfo=0;playlist=vn6b2gj4EVc" ~~~></iframe>
반응형
반응형

우울감은 비관적인 정서다. 그런데 사람은 비관적일 때
세상의 본 모습과 인생의 본질을 더 정확하게 인식할 수 있다.
그러므로 우울감은 부정적이기만 한 것이 아니다.
우리가 그것을 통해 세상의 본 모습을 깨달을 수 있다면
우울감도 긍정적인 역할을 할 수 있다.
초조함이 사람의 적극성을 일깨우는 원동력이 될 수 있는 것처럼 말이다.
- 페이융, ‘법화경 마음공부’에서 

우리는 늘 불안감을 안고 살아갑니다.
불안, 우울, 초조함은 해로운 감정입니다. 그러나 잘만 활용된다면
그 안에서도 긍정적 요소를 충분히 찾아낼 수 있습니다.
초조함은 적극성을 불러오고 불안과 우울은 현실성에 바탕한
꼼꼼한 사전준비의 계기가 될 수 있습니다.

반응형
반응형

칠월 숲은 
나뭇잎 소리로 분주하다. 
하늘을 가득 채운 잎사귀들이 
만드는 스킨십이다. 서걱서걱 여름 
소리에 마음이 열린다. 

- 김준태의《나무의 말이 좋아서》중에서 - 


* 7월의 숲.
푸르름의 절정입니다.
녹음방초 생명이 가득합니다.
그러나 와보지 않으면 소용없습니다. 
푸른 숲으로 오세요.
숲이 부릅니다.

반응형

'생활의 발견 > 아침편지' 카테고리의 다른 글

오프라 윈프리의 '인생 목표'  (0) 2019.07.03
일관(一貫)  (0) 2019.07.02
표정의 양식  (0) 2019.06.29
열렬한 애정, 그리고 열정  (0) 2019.06.28
마음에 소음이 일 때  (0) 2019.06.27

+ Recent posts