자바에서 소켓을 통해서 받은 xml 을 어떻게 파싱하면 되나요?

vudghkzm의 이미지

자바로 만든 서버 프로그램이 있습니다.
소켓을 통해서 xml 포맷의 데이타를 받아서, 받은 xml 데이타를 파싱하면 되는데.. 어떤 라이브러나 API 를 이용하면 되는지...등등해서 전체적으로 감이 잘 안옵니다.

소켓 통신은 짜봐서 알지만 데이타를 xml 로 주고 받은 적이 없어서 잘 모르겠네요..xml 데이타도 그냥 소켓을 통해 write() 하면 되는지요?

그리고 그렇게 받은 xml 데이타를 파싱할려고 할 때 자바에서는 어떤 메쏘드(API)나 써드 파티 라이브러리를 이용하면 되는지도 알고 싶습니다.

다크슈테펜의 이미지

자바에서는 XML형식에 맞춰서 write()해주시면 될겁니다.
그리고 만약에 그 xml을 파싱한다고 하면 sax나 dom을 이용해서 파싱을 하시면 될것 같습니다만.

인생이란게 다 그런게 아니겠어요....? 뭘(?)
http://schutepen.egloos.com

익명 사용자의 이미지

soap하고 다른 건가요?

다크슈테펜의 이미지

우선 자바에서는 XML을 파싱할때 두가지 방법을 사용합니다.물론 다른 방법도 있을 수 있습니다만 기초적인 내용으로 보통 두가지가 나옵니다.
하나는 SAX이고 하나는 DOM입니다.
두가지 차이는 SAX는 파싱을 할때 원소의 시작과 끝을 이용해서 XML을 파싱을 하게 됩니다.리소스를 적게 차지하지만 DOM보다는 기능이 강력하지 않습니다.보통 이벤트형 파싱이라고도 합니다.
두번째 DOM같은 경우에는 XML을 트리구조로 파싱을 합니다.그리고 응용프로그램이 이 트리구조를 순회하면서 해석을 하게 됩니다.
이밖에도 여러가지가 있습니다만 이 두가지 정도면 복잡한게 아니라면 충분하다고 생각합니다.

인생이란게 다 그런게 아니겠어요....? 뭘(?)
http://schutepen.egloos.com

atie의 이미지

jdk에도 xml관련 클래스들이 들어 있지만, 대개의 경우는 아파치의 xerces와 xalan을 씁니다. 데이타를 parsing한다니, xpath를 쓰는 것을 권하고 그럴 경우 xalan을 사용하시면 (xerces가 이미 포함된) 됩니다.
Parsing한 데이타를 어디에 쓸 것인가에 따라 좀 더 특화된 라이브러리를 쓸 수도 있습니다. 그러니 필요하시면 질문을 구체적으로 하시길 바랍니다.

----
I paint objects as I think them, not as I see them.
atie's minipage

vudghkzm의 이미지

몇 분 안된 사이에 이렇게나 답변들을 달아주셔서 감사드립니다.

정리하면...소켓으로 xml 데이타를 보낼때는 xml 양식에 맞게끔 문자열을 만들어서 write() 하면 되고, 받은 xml 데이타를 파싱할 때는 xerces 나 xalan 이라는 써드 파티 라이브러리를 이용하면 된다고 할 수 있겠네요..

xml 데이타를 파싱할려는 이유는..xml 에서 해당 엘레멘트에 해당하는 값이 무엇이냐만 얻어내면 되는 수준입니다. 즉 그냥 데이타 교환용으로 xml 을 사용할려는 것입니다. 아마 가장 간단한 수준으로 xml 을 사용할려는 수준으로 생각됩니다.

더불어 xml 을 만들때에도 그냥 문자열로 덧붙여서 만드는것 보다 ..더 손쉽게 xml 을 만드는 방법도 있을 거 같은데요, 위에서 언급된 xerces 나 xalan 이라는 녀석을 이용하면 xml 을 손 쉽게 만들어서 문자열로 얻어낼 수 있는지도 궁금하네요..

marantz의 이미지

vudghkzm wrote:
xml 데이타를 파싱할려는 이유는..xml 에서 해당 엘레멘트에 해당하는 값이 무엇이냐만 얻어내면 되는 수준입니다. 즉 그냥 데이타 교환용으로 xml 을 사용할려는 것입니다. 아마 가장 간단한 수준으로 xml 을 사용할려는 수준으로 생각됩니다.

vudghkzm님께서 말씀하신 바로 이 이유때문에 xml을 쓰는게 아니었나요? ^^;

Too Many Sceret is in your heart.
We must break it and don't forget it.
Until no more secret remains in your soul

vudghkzm의 이미지

저의 무지함이 그대로 들어나고 말았군요. ^^

atie의 이미지

vudghkzm wrote:

xml 데이타를 파싱할려는 이유는..xml 에서 해당 엘레멘트에 해당하는 값이 무엇이냐만 얻어내면 되는 수준입니다. 즉 그냥 데이타 교환용으로 xml 을 사용할려는 것입니다. 아마 가장 간단한 수준으로 xml 을 사용할려는 수준으로 생각됩니다.

element의 값을 꼭 집어서 편하게 가져올라고 쓰는 것이 xpath입니다. 직접 한 번 xpath예제를 보시면 "내 PC의 어떤 디렉토리 이름"을 어떻게 찾을까 정도로 쉽게 이해가 될 겁니다.

vudghkzm wrote:

더불어 xml 을 만들때에도 그냥 문자열로 덧붙여서 만드는것 보다 ..더 손쉽게 xml 을 만드는 방법도 있을 거 같은데요, 위에서 언급된 xerces 나 xalan 이라는 녀석을 이용하면 xml 을 손 쉽게 만들어서 문자열로 얻어낼 수 있는지도 궁금하네요..

요것은, xslt를 쓰는 것을 권합니다. 미리 xml 양식을 정해놓은 템플릿에 변하는 데이타 값만 콕콕 집어 넣을 수가 있답니다.

xpath나 xslt 둘다, xalan 하나만 있으면 api 지원이 됩니다.

----
I paint objects as I think them, not as I see them.
atie's minipage

M.W.Park의 이미지

전반적인 것들은 다른 분들께서 답글을 다신 것같고....
XML의 경우 그냥 stream에 쓰는 것보다는 아래처럼 하는 것이 세련되어 보이더군요. 8)

    private static void serialize(OutputStream os, Document doc)
            throws IOException {
        OutputFormat format = new OutputFormat(doc);

        XMLSerializer serial = new XMLSerializer(os, format);
        format.setIndenting(true);
        serial.serialize(doc);
    }

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

임창진의 이미지

betwixt 를 추천합니다. 거의 거저먹기 수준으로 데이타를 가져올수 있습니다. 반대의 경우도 거의 거저먹기 입니다.

아래링크를 따라가시면 샘플을 만들어둔게 있습니다. 참고하세요

http://www.sysmon.co.kr/bbs/zboard.php?id=pds&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=17

익명 사용자의 이미지

객체 -> XML Serializer (serialize) -> XML ---> network ---> XML -> XML Serializer (deserialize) -> 객체.

이렇게 쓰는것이죠.

파싱부분을 XMLSerializer에 맏기고 프로그래밍은 그냥 직접 객체에 접근하면 됩니다.

XMLSerializer는 자바에는 수십개의 오픈소스 라이브러리들이 있으니 인터넷에서 검색해서 찾아보시길...

개중 사용하기 쉬운걸로는 Castor 라고 있슴다.

mr.lee의 이미지

음.. JDOM 얘기는 왜 안나오는지 궁금합니다. 이참에 자바 및 C/C++에서의 XML 오픈소스 라이버러리에 대한 성능 및 기능비교 토론이 나와도 유익하지 않을까 싶네요...

atie의 이미지

sax/dom-->xpath/xslt-->xml binding ... 답변이 달리는 순서가 java-xml 역사를 보는 듯 하군요. castor가 언급이 되었으니 jaxb도 이야기 해야 하나요? 질문하신 분에 맞는 용도로는 굳이 xml binding까지는 필요가 없을 듯 하고, 또 parser의 이해가 없이 binding 레벨에서 프로그램 하라는 것도 좋은 생각은 아닙니다.

----
I paint objects as I think them, not as I see them.
atie's minipage

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.