스트레스가 적은 상황일수록 시스템은 취약해지기 마련이다. 따라서 강한 조직을 위해서는 언제나 무너지지 않을 정도의 스트레스를 일정하게 가해야 한다. 의도적인 실패를 설정해두는 것도 좋다. 그 실패가 학습을 독려하고 조직의 창조성을 끌어올리는 역할을 하기 때문이다. - 야마구치 슈, ‘철학은 어떻게 삶의 무기가 되는가’에서
외부의 혼란이나 압력에 오히려 성과가 상승하는 성질을 반 취약성이라 합니다. 절식이나 운동이라는 부하를 걸어 놓으면 오히려 건강해지는 것도 반취약적 특성에 해당됩니다. 앞이 안보이는 불확실성에 대처하기 위해서는 예방차원에서라도 미리 조직을 흔들어 놓을 필요가 있습니다.
우리는 모두 같은 것을 추구한다. 우리는 누구나 가장 숭고하고 가장 진실되게 자신을 표현하고 완성하고자 하는 열망을 갖고 있다. 나 역시 직접 경험해봐서 잘 알고 있다. 뭔가가 가슴에 깊이 와닿으면 그게 마치 진리를 비추는 등불처럼 느껴진다.
- 오프라 윈프리의《위즈덤》중에서 -
* '자기 완성'. 누구나 갖고 있는 열망입니다. 어떻게 하면 타고난 자기 잠재력을 극대화하고, 그것을 다른 사람 앞에 제대로 표현하느냐, 우리 모두의 과제이고 숙제입니다. 더 큰 과제는 '참나', '참된 나'를 찾는 것입니다. 무언가가 가슴에 깊이 다가올 때가 첫 신호입니다. 이 신호를 놓치지 않고 단단히 붙잡아야 자기 완성의 등불이 켜집니다.
아이러니 하게도 힘든 일이나 훌륭한 일을 하면 오히려 불행해지는 경우가 있습니다. 오만의 덫에 빠지기 때문입니다. ‘나는 칭찬받아 마땅한 일을 했어. 정말 고생했단 말이야.’라고 생각하면 오만해지기 쉽습니다. 오만한 사람은 미움을 받지요. 또 인간관계가 나빠져서 운이 달아나버립니다. - 니시나카 쓰토무, ‘운을 읽는 변호사’에서
힘든 일이나 훌륭한 일에는 ‘오만의 덫’이 존재합니다. 거만하고 겸손하지 못하면 애써 좋을 일을 해도 모두에게 미움을 받게 됩니다. 운을 좋게 하려면 겸손함이 절대 필요합니다.
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()가 있는데 혼란을 겪지 않길 바란다.)