달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2010. 1. 29. 19:09

XML 특수 문자 파싱 오류 확인 그거/Java2010. 1. 29. 19:09


<?xml version=\"1.0\" encoding=\"euc-kr\"?><root><data>한&#123;글1234 &#xF;5678&#15; &#16; English日本0A</data></root>

이런 XML을 파싱을 하다 보면...

[Fatal Error] :4:13: Character reference "&#15" is an invalid XML character.
org.xml.sax.SAXParseException: Character reference "&#15" is an invalid XML character.
 at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
 at cis.jcaps.app.XMLParserTest.handle(XMLParserTest.java:75)
 at cis.jcaps.app.XMLParserTest.doIt(XMLParserTest.java:53)
 at cis.jcaps.app.XMLParserTest.main(XMLParserTest.java:177)

이런 에러가 납니다.

바로 &#15; 요놈!. 특수문자가 변환된 놈 때문이지요..

이걸 HTML 파일로 저장해서 보면..



이렇게 보입니다.. 꼭 벌레같다는..

암튼. 저 데이터를 XML로 변환을 하면.. &#15; 가 되지요.

이  &#15; 를 다시 원래 벌레로 만들려면 XML 파서가 바로 위 같은 에러를 뱉어냅니다.

이 문제를 해결하기 위해서..

final Pattern nonValidPattern = Pattern.compile("&#(x?)([0-9a-fA-F]+);");

 public String stripNonValidXMLCharacters(String str) {
  StringBuffer out = new StringBuffer();
  Matcher matcher = nonValidPattern.matcher(str);
  int value = 0;
  boolean isHex = false;
  boolean valid = false;
  while (matcher.find())
  {
   isHex = matcher.group(1) != null;
   value = Integer.parseInt(matcher.group(2), isHex ? 16 : 10);
   valid = false;
   if ((value == 0x9) ||
     (value == 0xA) ||
     (value == 0xD) ||
     ((value >= 0x20) && (value <= 0xD7FF)) ||
     ((value >= 0xE000) && (value <= 0xFFFD)) ||
     ((value >= 0x10000) && (value <= 0x10FFFF)))
    valid = true;
   if (!valid)
    matcher.appendReplacement(out, "");
  }
  matcher.appendTail(out);
  return out.toString();
 }

이 method를 사용하면 됩니다.

"&#(x?)([0-9a-fA-F]+);"

바로 이 패턴을 이용하여, &#xx; 이런식의 문자열을 지워버리는거죠.

&#로 시작하고,
&#뒤에 x가 0번 혹은 1번만 나오고.
&#뒤에 뒤에 숫자, 또는 영문자 a~f 까지만 허용되는 문자열이 1번 이상 나오고,
마지막은 ; 로 끝나는 문자열을 찾는거죠.

해당 문자열을 찾은 후에

   if ((value == 0x9) ||
     (value == 0xA) ||
     (value == 0xD) ||
     ((value >= 0x20) && (value <= 0xD7FF)) ||
     ((value >= 0xE000) && (value <= 0xFFFD)) ||
     ((value >= 0x10000) && (value <= 0x10FFFF)))
    valid = true;


이 루틴을 이용해서, XML 파싱에 허용되는 문자들만 거르게 되는겁니다!! 냐하하하.

:
Posted by 뽀기
2010. 1. 29. 18:59

[DB] MSSQL 실행된 쿼리 조회하기... 그거/DB2010. 1. 29. 18:59


오라클의 archive를 조회하는 것 처럼.

MSSQL에서도 이미 실행된 쿼리들을 조회할 수 있답니다.


select
db_name(st.dbid) DBName
,qs.total_elapsed_time
,creation_time
,last_execution_time,text
from sys.dm_exec_query_stats qs cross apply sys.dm_exec_sql_text(qs.plan_handle)st
join sys.dm_exec_cached_plans cp on qs.plan_handle = cp.plan_handle
where creation_time >= '2010-01-01 00:00:00'
--and db_name(st.dbid) is not null and cp.objtype = 'proc' --조건: 종류
and text like '%delete%'
order by last_execution_time desc;

이렇게 하면 된답니다.

실행된 파라미터까지 정확히 나오지는 않는듯 합니다.....
@1 이런식으로 나오네요..

:
Posted by 뽀기
2010. 1. 25. 09:21

[정보] 무료로 사용해보세요~ 그거/기타2010. 1. 25. 09:21

Advanced SystemCare PRO Edition

프로모션 기간(1년)동안 무료랍니다.

좋다고 하던데. 쓰실 분은 함 써보시길...

http://db.iobit.com/license-free/ascpro-softpedia-giveaway.php

Email 과 Verification code를 입력하면.

Free -> PRO 로 변경할 수 있는 등록코드가 생성됩니다~

# 처음 설치하면 Free 버전이고.
# 등록코드 입력하면 PRO 버전으로 변경된다지요~~

:
Posted by 뽀기
2010. 1. 13. 09:27

TOSCA 2010 Event~ 생활/정보2010. 1. 13. 09:27



TOSCA EXCLUSIVE Event 합니다.

아... 갖고 싶다. ㅜㅜ
:
Posted by 뽀기
2010. 1. 11. 20:58

현대해상 차세대 오픈.... 생활/잡담2010. 1. 11. 20:58


드디어 한다고 합니다. ㅎㅎ

메일까지 왔습니다. ㅋㅋ


'생활 > 잡담' 카테고리의 다른 글

My IT Footprint  (0) 2010.04.01
독도는 우리땅~~~ 애국가~  (0) 2010.02.02
트위터... 가 대체 뭐야?  (0) 2009.09.16
이런 스팸 메일이....  (0) 2009.08.19
이런 신문 기사가....  (0) 2009.06.08
:
Posted by 뽀기
2009. 12. 31. 09:22

네이버 이벤트 - 아이폰을 준다네~ 생활/정보2009. 12. 31. 09:22


네이버 체크아웃에서 이벤트를 합니다~

아이폰을 준다고 하네요~

가입/구매/퍼가기

중 하나만 해도 응모기회가 주어진다고 하니.. 함 해보자!!

체크아웃 연말 이벤트! 100명에게 아이폰을 쏜다! 이벤트 보기

'생활 > 정보' 카테고리의 다른 글

성범죄자 열람 정보..  (0) 2010.03.11
TOSCA 2010 Event~  (0) 2010.01.13
GM 대우 Style Creator 777 동영상~  (0) 2009.11.12
GM 대우의 Style Creator 777 ~~  (0) 2009.11.12
원어데이 행사합니다~~  (0) 2009.09.14
:
Posted by 뽀기
2009. 11. 12. 08:55

GM 대우 Style Creator 777 동영상~ 생활/정보2009. 11. 12. 08:55


# 마티즈 크리에이티브
 


# 라세티 프리미어

'생활 > 정보' 카테고리의 다른 글

TOSCA 2010 Event~  (0) 2010.01.13
네이버 이벤트 - 아이폰을 준다네~  (0) 2009.12.31
GM 대우의 Style Creator 777 ~~  (0) 2009.11.12
원어데이 행사합니다~~  (0) 2009.09.14
예방접종 도우미 사이트  (0) 2009.05.11
:
Posted by 뽀기
2009. 11. 12. 08:54

GM 대우의 Style Creator 777 ~~ 생활/정보2009. 11. 12. 08:54



도전해보세요~

됐음 좋겠다는.. ㅎ
:
Posted by 뽀기
Inner Class에서 OuterClass의 변수를 참조하려면 아래와 같이 해야 된다는군요.
홋.홋.홋.홋.

01: class OuterClass {
02:     int varA = 100;
03:     class InnerClass {
04:         static final int varA = 20;
05:         void methodCall() {
06:             int varB = varA;
07:             int varC = this.varA;
08:             int varD = Outer.this.varA;
09:         }
10:     }
11: }

02 라인의 varA와 04 라인의 varA의 변수명이 같습니다.
이런 경우, 아래 처럼 하면....

06:             int varB = varA;
07:             int varC = this.varA;

varB와 varC에는 20이란 값이 들어갑니다.


OuterClass에 정의되어 있는 변수에 접근하기 위해서는....
아래와 같이 해야 합니다~

08:             int varD = Outer.this.varA;

varD에는 100이란 값이 들어가는거죠!
:
Posted by 뽀기
2009. 9. 16. 12:54

트위터... 가 대체 뭐야? 생활/잡담2009. 9. 16. 12:54


트위터가 대체 뭐야?
가입은 했는데. 도무지 이해할 수 없는 UI와..
알아 볼 수 없는 글들..

적응하려면 좀 걸릴듯.. ㅡㅡ;
우리나라꺼 미투데이도 그런가? 흠냘.

암튼 내 트위터는 여기.

http://twitter.com/lucky0702

'생활 > 잡담' 카테고리의 다른 글

독도는 우리땅~~~ 애국가~  (0) 2010.02.02
현대해상 차세대 오픈....  (0) 2010.01.11
이런 스팸 메일이....  (0) 2009.08.19
이런 신문 기사가....  (0) 2009.06.08
삼가 고인의 명복을 빕니다...  (0) 2009.05.30
:
Posted by 뽀기