기존의 URLLoader 의 경우

한상훈님의 말씀에 의하면

euc-kr 로 인코딩되어 있는 파일에서

4000 자가 넘는 xml 파일의 경우 파싱 에러가 난다고 합니다.

저 역시도 한글 파일의 내부 파서 오류때문에

엄청나게 고생했었습니다.

그래서 URLLoader 가 아니라

URLStream 으로 읽어들여 직접 "euc-kr" 로 읽어와서

XML 로 파싱하는 방법으로 해결하였습니다.

아래는 XMLLoader 클래스의 주요 소스입니다.

override protected function loadComplete( e: Event ): void
{
     try
     {
          this._xml = XML( this.loader.readMultiByte( this.loader.bytesAvailable, this.encode ) );
     }
     catch( e: TypeError )
     {
          this.dispatchEvent( new XMLLoaderEvent( XMLLoaderEvent.LOAD_FAIL, "parse error" ) );
          return;
     }
    
     this.dispatchEvent( new XMLLoaderEvent( XMLLoaderEvent.LOAD_COMPLETE ) );
}

위에서 보시다시피 URLStream.readMultiByte 로 직접 텍스트를 가져옵니다.

인코딩 타입은 기본으로 utf-8 로 잡혀있지만

XMLLoader.encode 라는 변수에 직접 euc-kr 또는 ascii 로 설정하실 수 있습니다.

아래는 euc-kr 로 작성된 파일을 URLLoader 와 XMLLoader 를 실험해놓은 페이지 입니다.

URLLoader : http://www.as3.kr/URLLoader/

XMLLoader : http://www.as3.kr/XMLLoader/

위 실험에서 URLLoader 는 50% 확률로 XML 이 오류가 나는 반면

XMLLoader 는 에러가 나지 않는 것을 보실 수 있습니다.



테스트에 사용된 소스와 관련 소스를 첨부합니다.

다운로드


신고
  1. 신명용 2008.03.08 04:40 신고

    오늘도 여기저기 인터넷을 떠돌다.. 우야꼬님 블로그에 들어왔네요..~
    URLLoader로 데이터를 읽어올 경우..XML 글자가 많을때 오류를 내는게 아니라 네트웍을 타고 뒤에 가비지가 따라 붙어서 XML 파싱 오류가 발생하는 것입니다...^^
    이 부분은 top노드가 <result>일 경우 lastIndexOf("/>")를 이용해서 URLLoader.data에 붙어오는 { XML 이 아닌 쓰레기}들을 제거해주면 됩니다. 이렇게 하면 4000글자 뿐만 아니라 3M가 넘는 XML 파일의 경우에도 전혀~ 문제없이 잘 읽어들입니다..^^ 하지만..우리가 이런 수고를 해서 XML을 얻어야 하는것에 대해..adobe는 반성해야 합니다..-.-

    • Favicon of http://wooyaggo.tistory.com 우야꼬  2008.03.08 12:21 신고

      아 정확한 원인을 알려주셨네요^^;;
      그러면 꼭 한글이어야 에러가 나는게 아니었나보군요.
      특히 lastIndexOf() 은 머리를 스치네요.
      왜 생각하지 못했을까 ㅎㅎ;;
      감사합니다~

  2. 신명용 2008.03.08 16:20 신고

    ^________^
    이 부분이 정말 황당한 경우는 가비지가 "/>"로 들어올떄도 있다는건데 {수백번에 한번 정도씩...} 이렇게 수백번에 한번이라도 안될 경우, 처음 들어온 사람에게는 그게 100%니까...ㅋㅋ
    -.- 이럴 경우까지도 고려해서 lastIndexOf()로 잡아내야 해요..^^ 얼마전에 이러한 케이스가 발견되어서.. 정윤수과장님과... 한참.. 웃었던 적이 있는데..-.- 이게.. 발견이 되었으니... 웃었지.. 발견못했다면... 지금도 울고 있었을 듯..ㅋㅋ

  3. Favicon of http://hangunsworld.com Han Sanghun 2008.03.10 13:24 신고

    4천자 얘기는 제가 처음 꺼낸 얘긴데... 그동안 잘못된 정보를 여기저기 흘리고 다녔군요 ㅠㅠ

    문자열의 제일 뒤에 가비지 데이터가 붙기만 하면 얼마든지 처리할 수가 있는데, 문제는 문자열 뒤의 데이터 일부가 유실되고, 그 뒤에 가비지 데이터가 붙는 경우가 있더군요.
    어도비에서 이 문제는 조속히 해결해 줘야 하는데, 아직도 소식이 없네요.

  4. Favicon of http://hangunsworld.com Han Sanghun 2008.03.10 13:26 신고

    저도 바이트어레이로 읽어서 이래저래 가공하는 걸 시도해보다가, 잘 안되서 포기했었는데, URLStream을 이용하는 것은 생각 못해봈네요
    제가 만든 XML 로더보다 훨씬 깔끔해 보이는군요 ㅎㅎ

    • Favicon of http://wooyaggo.tistory.com 우야꼬  2008.03.10 13:47 신고

      감사감사^^
      한상훈님이 칭찬해주시니 기분좋네요 ㅎㅎ
      그래도 한상훈님이 샘플주셔서 겨우 만든거에요
      _(_ _)_ 감사

  5. 2008.03.21 19:53 신고

    고수님들..존경합니다 _(__)_

  6. 금돌 2008.08.06 19:01 신고

    ㅎㅎ 감사합니당~^^

  7. Favicon of http://blog.naver.com/bug29 난누군가 2009.12.14 16:18 신고

    글 열심히 잘 읽었습니다. 그런데 lastIndexOf로 URLLoader.data의 정보를 어떻게 정리하시는 건가요? URLLoader.data를 텍스트로 읽어들여서 가비지를 정리한단 말씀인가요? 그리고 이건 URLStream을 쓰면 상관없는 얘기인가요?

  8. Favicon of http://www.minarto.com minarto 2009.12.16 11:55 신고

    해결방법은 꼭 URLStream 만이 아니고 URLLoader 의 데이터 포맷을 기본값이 아닌 바이너리로 바꿔도 됩니다...
    하지만 신명용님 말씀에 공감...ㅡ.,ㅡ;;;

  9. jebop 2010.04.27 15:05 신고

    아.. 고수님들.. 저도 이런 대화에 자연스레 같이 이야기할수있는날이 빨리오면 좋겠네요^^;

  10. Favicon of http://blog.jidolstar.com 지돌스타 2010.07.28 21:35 신고

    ㅎㅎㅎ 이런 문제가 있었다니!
    이것도 해결방법중 하나...
    System.useCodePage 대신 이렇게.. http://airdev.tistory.com/397

+ Recent posts