SAX Programming 에서 질문요?

뭉게뭉게의 이미지

현재 클라이언트는 자바프로그램이고 서버프로그램은 C++입니다.

클라이언트 개발환경은 Windows XP, Eclipse 3.2(JDT)이고

서버 개발환경은 Linux(Cent OS), Eclipse 3.2(CDT : g++)입니다.

자바에서 XML을 만들어 서버프로그램한테 보내면

소켓통신이라서 SAX API를 이용한 XML파싱을 할려고 하는데

어떻게 해야 될지 모르겠습니다.

서버프로그램에서 테스트로 a.xml을 만들어서 파싱하면 잘 됩니다.

char* xmlFile = "a.xml"
SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
중략
parser->parse(xmlFile);

parse 인자를 xml의 파일 경로를 주면 잘 되는데 문제는 소켓통신을

해서 클라이언트에서 받아온 xml의 내용을 char* buf로 잘 받았습니다.

buf의 내용을 파싱을 해야 되는데

praser->parse(인자)

여기에서 어떤 인자를 주어야 될지를 잘 모르겠습니다..

고수님들의 많은 답변 부탁드립니다.

atie의 이미지

코드나 여건에 따라 정답은 다를테니 대략 답을 드리면, 버퍼에 xml 문서를 다 받은 것을 확인한 후에 파일로 실제 변환해서 넘기던지(1) 메모리에서 넘기던지(2) 해서 처리하면 일반 파일로 할 때와 동일할텐데요. 확인해야 할 것은 xml 특성상 태그가 대응이 안 된 상태에서 파싱을 해서 에러가 나는 것이 아닌가를 먼저 보세요.

1)로 하면 확인이 쉬울테고, 나중에 어차피 xml을 파일로 백업해달라는 것이 보통일 겁니다.
----
I paint objects as I think them, not as I see them.
Ubuntu Edgy user / Ubuntu KoreanTeam

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

모지리의 이미지

통신을 통해 전송되는 XML을 파싱 하실려면 일단 전송이 완료된 데이터를 가지고 핸들을 하셔야만 합니다. 즉, 파일/버퍼 뭐 같죠. 한가지 재미있는 방법은 TAG를 이용하는 방법도 있습니다. 지금은 제가 이쪽 일을 하지는 않지만 예전에 TAG를 이용해서 XML데이터를 전송한적이 있습니다. 즉, DTD로 데이터 형식을 양쪽에 정의 해놓고 TAG 형식의 통신 데이터를 보내서 XML로 만들어 내거나 아주 다양한 방법으로 가공이 가능합니다.

장점은 XML 이라는 파일을 통째로 보내지 않아도 돼고 XML을 원하면 얼마든지 손쉽게 변환이 가능하다는 겁니다. FIX 라는것을 한번 참고해보셔도 좋을듯 싶지만 질문 하신 내용은 그게 아니지만 오래된 내용이라서 함수 형식까지는... 죄송합니다. 그냥 흥미로웠던 내용이 생각나서요.

뭉게뭉게의 이미지

parse 인자를 xml의 파일 경로를 주면 잘 되는데 문제는 소켓통신을

해서 클라이언트에서 받아온 xml의 내용을 char* buf로 잘 받았습니다.

buf의 내용을 파싱을 해야 되는데

praser->parse(인자)<= 인자안에 파일명을 기입하면 잘 읽습니다.
parser->parse(인자)<= 인자안에 buf 하면 에러가 나네요.. SAX2 API에 보니깐 char* 인자를 받는 API가 엄네요.. ㅠㅠ

buf의 내용(243.222.132.111WebLogic 8.x)

제가 만드는 프로그램은 속도에 민감해서 디스크 I/O가 일어나면 안됩니다.

buf의 내용을 xml파일로 만들어 이것을 다시 읽으면 해결책은 되겠지만 바로 SAX2 API에서 제공되는 클래스를 이용하여

buf의 내용을 파싱하고 싶습니다..

뭉게뭉게의 이미지

제가 자바로 테스트한 결과 제가 구현하고 싶은 것을 제공하는 메소드가 있었습니다.

ServerSocket ss = new ServerSocket (3000);

System.out.println("Server Start...");
Socket s = ss.accept();


SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();

MyHandler3 myh = new MyHandler3();

System.out.println("SAX Parser Start");
sp.parse(s.getInputStream(), myh);

자바에서는 parse 인자에다가 sp.parse(s.getInputStream(), myh)와 같이 소켓의 스트림을 바로 읽어 오면 되는데요..

Xerces-C에서 parse(인자)처럼 인자에 무엇을 넣어야 될지를 모르겠네요..

atie의 이미지

역시 파일을 만들면 안되는 작업이로군요. 얼핏 아는 것으로 답을 드리면 자바에서 구현된 것과 같이 스트림을 직접 파싱하도록 파생 클래스 둘 이상은 만들어야 할 겁니다.

BinInputStream 클래스에 바이트를 읽는 메소드와 현재 위치를 읽는 메소드를 추가한 MyInputStream 클래스가 필요할 것이고, 이것이 소켓 오브젝트를 만들어서 힙의 위치를 반환하는 MyInputSource 클래스를 사용하면 파서가 소켓의 바이트를 읽을 수 있을 겁니다. 핸들러를 따로 만들어야 하는 것은 경우에 따라 다를테고요.

s.getInputStream()를 풀어쓴 것이어서 구현까지는 답변을 할 수는 없겠습니다.;;
----
I paint objects as I think them, not as I see them.
Ubuntu Edgy user / Ubuntu KoreanTeam

----
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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.