Shinnara's Blog
Talking with Shinnara :: NaraTalk.com


요즘 진행하고 있는 프로젝트에서 C 모듈과 Java 모듈이 서로 통신할 일이 있는데, 역시 이기종간의 통신은 생각해볼 게 많은것 같습니다.

C 모듈에서 전달된 XML 을 Java 로 파싱하는 부분이 있는데, 여기서 에러가 발생하더군요.

에러 내용은 이렇습니다.

Content is not allowed in trailing section.


받을 내용을 찍어봐도 별 이상이 없는데 왜 그런지..

그래서 받은 내용 byte[] 를 String 으로 바꾸어 trim() 을 해주고 다시 byte[] 로 바꾸었습니다.

그랬더니 파싱에러가 사라지네요.

위와 같은 에러가 나면 trim() 으로 해결하세요~ 


p.s. 원인을 분석해보니 C 모듈에서 보낼 때 널문자를 더 보내서 문제가 발생하는 것이었답니다..^^

0 Trackback, 0 Comment

TRACKBACK :: http://naratalk.com/trackback/126 관련글 쓰기

댓글을 달아 주세요


사용자 삽입 이미지
요즘 들어 포스팅이 늘어가네요. 업무를 통해 얻는 정보나 팁등을 그대로 방치하면 나중에 또 다시 찾아야 하는 문제도 있고, 저와 비슷한 문제로 검색하시는 분들에게 보다 선별된(?) 정보를 드렸으면 합니다.. ^^


프로젝트를 진행하면서 자주 XML을 접하지만, 그 내용을 파싱한다기 보다는 주로 XML 문서를 만들어 전달하는 역할을 하다 보니 문서에서 정보 얻어오는 부분은 기억 저편으로 멀리 보낸듯했다.

그러다 마침 다른 서버로 부터 간단한 XML 문서를 받아 다음의 처리를 결정하는 부분을 구현해야 했답니다.

다음은 간단한 예..
 

[file: response.xml]

<UAResponse>

<IsHandled>true</IsHandled>

<Header>

<ContentType>text/xml; charset=utf-8</ContentType>

</Header>

</UAResponse>


위의 XML 로 부터 ContentType 값을 얻어오는 방법을 간략히 소개하고자 한다. ( XML 및 XPath 에 대해 고수인 분들은 패스~^^ , 이 문서는 XML을 처음 접하는 분을 대상으로한 간략한 소개 페이지 입니다.)

XML 문서를 다루고 그 안의 정보를 찾아내는 방법은 여러가지가 있겠지만, 가장 강력한 방법은 XPath 를 이용한 방법입니다. 다른 처리 방법에 대해서는 관련 문서를 참고하시고... ^^

먼저 소스 코드부터 보여드립니다.

                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                factory.setNamespaceAware(true);
                DocumentBuilder builder = factory.newDocumentBuilder();
                Document doc = builder.parse("response.xml");
               
                XPathFactory xfactory = XPathFactory.newInstance();
                XPath xpath = xfactory.newXPath();
                               
                XPathExpression expr = xpath.compile("//ContentType/text()");
               
                String contentType  = expr.evaluate(doc);

               
너무 간단하지 않나요? 위의 코드는 문서내에 있는 ContentType 에서 처음으로 나타나는 엘리먼트의 text 값을 가져오게 됩니다. 만약 ContentType 이 여러개라면 다음과 같은 형태로 바꿔볼 수 있습니다.


                Object result = expr.evaluate(doc, XPathConstants.NODESET);
               
              NodeList nodes = (NodeList) result;
              for( int i=0; i< nodes.getLength();i++) {
                   System.out.println( nodes.item(i).getNodeValue());
              }


만약 네트워크를 통해 byte[] 형태로 문서를 받으셨다면 Document 를 만들때 다음과 같이 하시면 됩니다.


                      
                ByteArrayInputStream bis = new ByteArrayInputStream(buffer);
               
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                factory.setNamespaceAware(true);
                DocumentBuilder builder = factory.newDocumentBuilder();
                Document doc = builder.parse(bis);


자세한 XPath 의 사용법은 나중에 기회가 되면 다시 적기로 하고, 오늘은 유용한 자료 하나 소개하면서 접을까합니다.



p.s. 생각해보니 package 도 알려드려야 할 것 같아서...
저는 다음과 같이 import 합니다.

    import javax.xml.xpath.*;
    import javax.xml.parsers.*;
    import org.w3c.dom.*;





TAG java, XML, xpath
0 Trackback, 0 Comment

TRACKBACK :: http://naratalk.com/trackback/97 관련글 쓰기

댓글을 달아 주세요

GWT (Google Web Toolkit)을 이용하여 테스트를 하는 중에 서버로부터 xml 데이터를 받아서 처리를 해야할 일이 생겼다.

그래서 아주 아주 단순하게..

ResponseTextHandler 를 implement 해서 핸들러를 구현하고

HTTPRequest.asyncGet(url, handler);

이렇게 작성하였는데.. 실행을 해보니 com.google.gwt.xml 에 대해 resolve 를 할 수 없다나?

아무리 찾아봐도 분명 클래스패스안에 있는 jar 화일에는 해당 패키지가 있는데 못한다 싶어

gwt 홈페이지를 찾아봐도 별 다른 이야기가 없었다.

gwt 1.3.3을 쓰고 있었는데 1.4.10 RC 가 나왔다고 해서 그걸 깔면 될려나 해서 깔았더니

결과는 마찬가지..

다시 검색을 시작했는데.. 이번엔 네이버를 통해서 검색을 했다.. 요즘 이상하게 구글 검색 신공이 잘 안먹혀서..

그러던 중 발견한 것이..

http://cafe.naver.com/javalove.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1935

이 글을 읽는 도중 [모듈].gwt.xml 을 편집하면 된다는 이야기가 있어

다음을 추가해주었다.

<inherits name='com.google.gwt.xml.XML' />

그리고 나서 실행해보니..

아직 디버그는 해야하지만 import error 는 더 이상 나지 않았다~~~

얼른 더 고쳐봐야지..



TAG GWT, XML
0 Trackback, 0 Comment

TRACKBACK :: http://naratalk.com/trackback/48 관련글 쓰기

댓글을 달아 주세요

1 
다...... (264)
Computer/Programming (106)
Links (14)
책 읽는 즐거움 (7)
끄적임 (66)
즐거운 과학 나라 (7)
일본 (5)
Study (4)