참고: http://forums.sun.com/thread.jspa?threadID=5294908

StringReader sr = new StringReader(sb.toString());
InputSource xmlSource = new InputSource(sr);

ret = xpath.evaluate("//GetLASeR/RET", xmlSource); // 여기까지는 가능
ret = xpath.evaluate("//GetLASeR/RET", xmlSource); // 여기서 예외발생 - Stream closed.
evaluate() 실행하면 스트림의 처음부터 끝까지 읽어서 검색하는 듯.
그래서 첫번째를 실행하고 스트림이 닫혔기 때문에, 두번째의 evaluate()에서 예외발생
(스트림이니까 한번 쭉 읽어들이고 나면 다시 처음부분으로는 접근불가?)

검색 원본이 파일일 경우에는 이런 예외가 발생하지 않는데,
// 검색 원본 InputSource 객체 생성 - 검색 원본이 XML문서 파일이므로.
InputSource xmlSource = new InputSource("WebContent/ch13/bml.xml");

System.out.println("--책 아이디로 제목 찾기");
String title = xpath.evaluate("/booklist/book/title[../@id='b2']", xmlSource);
System.out.println(title);
       
System.out.println("--책 아이디로 book 엘리먼트 찾기");
Node nBook = (Node) xpath.evaluate("/booklist/book[@id='b2']", xmlSource, XPathConstants.NODE);
Element eBook = (Element) nBook;
System.out.println(eBook.getAttribute("kind"));
아마도 두번째 evaluate()부터는 다시 파일에서 읽어들여서 처리하는 듯하다.
참고: http://www.stylusstudio.com/xmldev/200210/post10820.html

InputSource xmlSource = new InputSource(new StringReader(sb.toString()));
12장 동적 유효성 검사 프로그래밍도 패스.

13장 XPath 검색 프로그래밍