달력

122024  이전 다음

  • 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

Code Assist & Templates

eclipse 2008. 10. 15. 13:51


'eclipse' 카테고리의 다른 글

Eclipse Tip  (0) 2008.09.08
JUnit 관련 사이트  (0) 2008.09.02
Eclipse 관련 IBM developerworks  (0) 2008.09.02
Eclipse PlugIn  (0) 2008.08.29
이클립스 가니메데 - IBM developerworks  (0) 2008.07.28
Posted by marryjane
|


memcmp() 함수는 메모리 영역 s1과 s2의 처음 n 바이트를 비교한다. 이 함수는 s1 이 s2 보다 작으면 0보다 작은 정수, 같으면 0, 크면 0보다 큰 정수를 반환한다.

1. 사용법
#include <string.h>

int memcmp(const void *s1, const void *s2, size_t n);

2. 예제
#include <string.h>
#include <unistd.h>
#include <stdio.h>

typedef struct __person
{
    int  age;
    char name[12];
} person;

int main()
{
    person a, b;
    int state;

    a.age = 28;
    strncmp(a.name, "yundream", 11);

    b.age = 24;
    strncmp(a.name, "gim", 11);

    // a 와 b 의 처음 8 바이트를 비교한다. 
    state = memcmp((void *)&a, (void *)&b, 8);
    if (state < 0)
    {
        printf("b older than a\n");
    }
    else if(state == 0)
    {
        printf("same same\n");
    }
    else
        printf("a older than b\n");

    return 0;
}

'C' 카테고리의 다른 글

C 프로그램 지역변수.전역변수.정적변수 외부변수  (0) 2009.03.03
gcc 컴파일 옵션  (0) 2008.07.16
make  (0) 2008.06.04
[함수] sprintf - 출력  (0) 2008.05.16
[함수] memcpy - 메모리카피  (0) 2008.05.16
Posted by marryjane
|

http://kin.naver.com/knowhow/entry.php?eid=8exJH8kaO+SwlbFfPflNJ8AFKSXmUV9e

  A B C
1 목록1 목록2
2 1 a
3 2 b
4 3 c
5 4 d
6 5 e
7 6 f
8 7 g
9 8 h
10 9 i
11 10 j
12 11 k
13 12 l
14 13 m
15 14 n
16 15 o
17 16 p

 

위와 같은 목록에서

 

=VLOOKUP("아",$A$1:$C$17,3,FALSE)

를 하면 값은 h 가 출력됩니다.

 

하지만 값 열의 i의 값을 불러올 수는 없습니다.

 

하지만 목록1과 목록2에서 조건을 주어 값 열의 데이터를 원하는 것으로

불러올 수는 있습니다

 

목록1 목록2
1 a
16 p

 

a 와 p의 값의 수식은

 

=INDIRECT("C"&SUMPRODUCT(($B$2:$B$17=F2)*($C$2:$C$17=G2)*(ROW($D$2:$D$17))))

 

=INDIRECT("C"&SUMPRODUCT(($B$2:$B$17=F3)*($C$2:$C$17=G3)*(ROW($D$2:$D$17))))

입니다

 

여기서 수식 설명입니다

 

SUMPRODUCT(($B$2:$B$17=F3)*($C$2:$C$17=G3)*(ROW($D$2:$D$17)))

 

에서

$B$2:$B$17=F2  는 "가" 일 때만

1의 값을 나머지는 0의 값을 가집니다

 

$C$2:$C$17=G2  는 1 일 때만 1의 값을 가지고 나머지는 0을 가집니다

 

($B$2:$B$17=F2)*($C$2:$C$17=G2)

의 값은

 

1 1 1
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
1 0 0

 

에서 2번째 열의 값으로 배열형태를 취합니다

 

ROW($C$2:$C$17)

는 각각의 셀의 행번호이고

 

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

의 값으로 배열의 형태를 취합니다

 

여기서

 

sumproduct 함수의 값은

위의 두 수식에서

각각 2와 17을 가집니다

 

그리고

 

마지막으로 indirect 함수를 적용합니다

c 열에서 값을 불러오므로

=Indirect("C"&

 

까지 해서 열의 값을 지정하고 행의 값은 위의 Sumproduct 함수의 결과값으로 지정하면

 

위의 수식은 각각

=Indirect("C2")

=Indirect("C17")

 

이 됩니다

 

최종적으로

 

첫번째 수식=a

두번째 수식=p

의 값을 출력합니다


'excel' 카테고리의 다른 글

사용자 정의 함수 사용하기  (0) 2008.11.11
[함수]문자열자르기 - SEARCH  (0) 2008.11.11
[함수]파일 및 시트명  (0) 2008.09.30
[함수]엑셀함수  (0) 2008.09.30
[함수]indirect - 문자열을 참조로 사용할 때  (0) 2008.09.25
Posted by marryjane
|

[함수]파일 및 시트명

excel 2008. 9. 30. 13:27

시트명 
=REPLACE(CELL("filename",A1),1,FIND("]",CELL("filename",A1)),"")

년/월/시트명
=DATE(YEAR(TODAY()),MONTH(TODAY()),REPLACE(CELL("filename",A1),1,FIND("]",CELL("filename",A1)),""))

파일명 
=MID(CELL("filename"),FIND("[",CELL("filename"))+1,FIND("]",CELL("filename"))-FIND("[",CELL("filename"))-5)

현재파일의 시트로의 하이퍼링크
=HYPERLINK(CONCATENATE(MID(CELL("filename"),FIND("[",CELL("filename")),FIND("]",CELL("filename"))-FIND("[",CELL("filename"))+1), K2, "!a8"),K2)

줄바꿈
CHAR(10)

시트명 오름차순정렬 메크로
Sub SheetsSort()
 Dim i As Integer
 Dim j As Integer
 Dim intCount As Integer
 Dim varTemp
 Dim strName() As String
    
   intCount = Sheets.Count
    ReDim strName(intCount)
    
    For i = intCount To 1 Step -1
        strName(i) = Sheets(i).Name
    Next i
    
    For i = UBound(strName()) - 1 To LBound(strName()) Step -1
        For j = 1 To i
            If strName(j) > strName(j + 1) Then
                varTemp = strName(j)
                strName(j) = strName(j + 1)
                strName(j + 1) = varTemp
                Sheets(varTemp).Move after:=Sheets(strName(j))
            End If
        Next j
    Next i
    Sheet1.Activate
End Sub
Posted by marryjane
|

[함수]엑셀함수

excel 2008. 9. 30. 13:22


수학함수 

PRODUCT(number1,number2,...)

- 인수를 모두 곱한 결과를 표시합니다.

RANDBETWEEN(bottom,top)

- 지정한 두 수 사이의 임의의 수를 반환합니다. 워크시트를 계산할 때마다 새로운 임의의 수가 반환됩니다.

ROMAN(number,form)

- 아라비아 숫자를 텍스트인 로마 숫자로 변환합니다.

- form : 0-고전스타일, 1~3 -더간결, 4-단순스타일

ROUND(number,num_digits) | ROUNDDOWN(number,num_digits) | ROUNDUP(number,num_digits)

- 숫자를 지정한 자릿수로 반올림합니다.

SUBTOTAL(function_num,ref1,ref2, ...)

- 목록이나 데이터베이스에서 부분합을 구합니다. 일반적으로 데이터 메뉴의 부분합 명령을 사용하여 부분합 목록을 작성하는 것보다 더 쉽습니다. 일단 부분합 목록이 만들어지면 SUBTOTAL 함수를 편집하여 목록을 수정할 수 있습니다.

- function_num : 1-AVERAGE, 2-COUNT, 3-COUNTA,4-MAX,5-MIN,6-PRODUCT,7-STDEV,8-STDEVP,9-SUM,10-VAR,11-VARP

SUM(number1,number2, ...)

SUMIF(range,criteria,sum_range)

- range : 조건을 적용시킬 셀 범위, 

- criteria : 숫자,수식 텍스트 형태로 찾을 조건(ex  32, "32"," >32", "사과")

- sum_range : 합을 구할 실제 셀.

- ex. SUMIF(A2:A5,">160000",B2:B5)

SUMPRODUCT(array1,array2,array3, ...)

- 주어진 배열에서 해당 요소들을 모두 곱하고 그 곱의 합계를 반환합니다.

SUMSQ(number1,number2, ...)

- 인수의 제곱의 합을 반환합니다.


날짜 및 시간함수

DATE(year,month,day)

- 특정 날짜를 나타내는 순차 일련 번호를 반환합니다. 함수가 입력되기 전의 셀이 일반 서식을 가지고 있어도 결과값은 날짜 서식으로 지정됩니다.

DATEVALUE(date_text) 

- date_text에 해당하는 날짜의 일련 번호를 반환합니다. 텍스트로 표시된 날짜를 DATEVALUE를 사용하여 일련 번호로 변환합니다.

DAY(serial_number)
- 주어진 날짜에서 일에 대한 일련 번호를 반환합니다. 일은 1에서 31까지의 정수로 표시됩니다.

DAYS360(start_date,end_date,method)

- 1년을 360일(12달*30일)로 가정하고 두 날짜 사이의 일 수를 반환합니다. 회계 계산에 사용됩니다. 회계 체계가 12달 30일을 기준으로 할 때 이 함수를 사용하여 임금을 계산할 수 있습니다.

EDATE(start_date,months)

- 지정한 날짜(start_date) 전이나 후의 개월 수를 나타내는 날짜의 일련 번호를 반환합니다. EDATE를 사용하여 발행일과 월과 일이 같은 만기일이나 기한을 계산합니다.

EOMONTH(start_date,months)

- start_date로 지정된 달 수 이전이나 이후의 달의 마지막 날의 날짜 일련 번호를 반환합니다. EOMONTH를 사용하여 그 달의 마지막 날에 해당하는 만기일을 계산할 수 있습니다.

HOUR(serial_number)
- 시간 값의 시를 반환합니다. 시간은 0(오전 12:00)부터 23(오후 11:00)까지의 정수로 표시됩니다.

MINUTE(serial_number)
- 시간 값의 분을 반환합니다. 분은 0부터 59까지의 정수로 표시됩니다.

SECOND(serial_number)

- 시간 값의 초를 반환합니다. 초는 0(영)부터 59까지의 정수로 표시됩니다.

MONTH(serial_number)

- 일련 번호로 표시된 날짜의 월을 표시합니다. 월은 1(1월)에서 12(12월)까지의 정수로 표시됩니다.

NETWORKDAYS(start_date,end_date,holidays)
- start_date와 end_date 사이의 전체 작업 일수를 반환합니다. 작업 일수에 주말과 휴일은 포함되지 않습니다. NETWORKDAYS를 사용하면 특정 기간 동안 작업한 날짜 수를 기초로 하여 발생된 직원의 임금을 계산할 수 있습니다.

NOW( )

- 현재 날짜와 시간의 일련 번호를 반환합니다. 함수가 입력되기 전의 셀이 일반 서식을 가지고 있어도 결과값은 날짜 서식으로 지정됩니다.

TIME(hour,minute,second)

- 특정 시간에 대한 정수를 반환합니다. 함수가 입력되기 전의 셀이 일반 서식을 가지고 있어도 결과값은 날짜 서식으로 지정됩니다.

TIMEVALUE(time_text)

- 시간을 나타내는 실수를 텍스트 문자열로 반환합니다. 실수는 0(영)부터 0.99999999까지 범위의 값이며 0:00:00(오전 12:00:00)부터 23:59:59(오후 11:59:59)까지의 시간을 나타냅니다.

TODAY( )

- 현재 날짜의 일련 번호를 구합니다. 일련 번호는 Microsoft Excel에서 날짜와 시간 계산에 사용하는 날짜-시간 코드입니다. 함수가 입력되기 전의 셀이 일반 서식을 가지고 있어도 결과값은 날짜 서식으로 지정됩니다.

WEEKDAY(serial_number,return_type)
- 날짜에 해당하는 요일을 표시합니다. 기본적으로 요일은 1(일요일)에서 7(토요일)까지의 정수입니다.

WEEKNUM(serial_num,return_type)

- 지정한 주가 일 년 중 몇째 주인지를 나타내는 숫자를 반환합니다.

WORKDAY(start_date,days,holidays)

- 특정 일(시작 날짜)의 전이나 후의 날짜 수에서 주말이나 휴일을 제외한 날짜 수, 즉 평일 수를 반환합니다. WORKDAY 함수를 사용하면 청구서 지불 기한이나 배달 예정일, 작업 일수 등을 계산할 때 주말이나 휴일을 제외할 수 있습니다.

YEAR(serial_number)
- 날짜에 해당하는 연도를 표시합니다. 연도는 1900에서 9999까지의 정수입니다.

YEARFRAC(start_date,end_date,basis)

- start_date와 end_date 사이의 날짜 수가 일 년 중 차지하는 비율을 반환합니다. YEARFRAC 워크시트 함수를 사용하면 특정 기간에 대한 연간 이익 또는 채무의 비율을 구할 수 있습니다.

- basis : 0 or 생략-미국(미국증권업협회) 30/360, 1-실제/실제, 2-실제/360, 3-실제/365, 4-유럽 30/360 


텍스트 및 데이타함수 

CHAR(number)

- 코드 번호에 해당되는 문자를 반환합니다.

CLEAN(text)

- 인쇄할 수 없는 문자를 텍스트에서 모두 삭제합니다. 

CODE(text)

- 텍스트의 첫째 문자에 대한 숫자 코드를 반환합니다.

CONCATENATE (text1,text2,...)
- 여러 문자열 항목을 한 문자열로 합칩니다.

WON(number,decimals)

- 숫자를 텍스트 형식으로 변환하고 통화 기호를 적용하는 방법을 설명합니다.

EXACT(text1,text2)

- 두 문자열을 비교하여 정확하게 일치하면 TRUE를 반환하고 일치하지 않으면 FALSE를 반환합니다.

FIND(find_text,within_text,start_num)

- FIND 함수는 다른 텍스트 문자열(within_text)에서 텍스트 문자열(find_text)을 찾아서 within_text의 첫째 문자에서 find_text의 시작 위치 번호를 반환합니다.

FIXED(number,decimals,no_commas)

- 수를 지정된 자릿수에서 올림하여, 마침표와 쉼표를 사용하여 십진수 서식으로 지정하고, 결과를 텍스트로 표시합니다.

LEFT(text,num_chars) | LEFTB(text,num_bytes)

- LEFT는 지정한 문자 수에 따라 텍스트 문자열의 첫 문자부터 원하는 수 만큼의 문자를 반환합니다.

LEN(text)

LOWER(text) | UPPER(text) 

- 텍스트 모두를 t소문자, 대문자로 변환합니다.

MID(text,start_num,num_chars)

PHONETIC(reference)

- 텍스트에서 윗주 문자를 추출합니다.

PROPER(text)

- 단어의 첫째 문자와 영문자가 아닌 문자 다음에 오는 영문자를 대문자로 변환합니다. 나머지 문자들은 소문자로 변환합니다.

REPLACE(old_text,start_num,num_chars,new_text)

- REPLACE는 지정한 문자 수에 따라 문자열의 일부를 다른 문자열로 바꿉니다.

REPT(text,number_times)

- 텍스트를 지정한 횟수만큼 반복합니다. REPT를 사용하여 여러 개의 문자열 인스턴스로 셀을 채울 수 있습니다.

RIGHT(text,num_chars) | RIGHTB(text,num_bytes)

- RIGHT는 지정한 문자 수에 따라 텍스트 문자열의 마지막 문자부터 지정된 개수의 문자를 반환합니다.

SEARCH(find_text,within_text,start_num) | SEARCHB(find_text,within_text,start_num)

- SEARCH는 start_num부터 시작하여 특정 문자 또는 텍스트 문자열이 처음 발견되는 문자의 위치를 반환합니다. SEARCH를 사용하여 또 다른 텍스트 문자열 안에서 문자 또는 텍스트 문자열의 위치를 찾습니다. 그러면 MID 또는 REPLACE 함수를 사용하여 텍스트를 변경할 수 있습니다.

SUBSTITUTE(text,old_text,new_text,instance_num)
- 문자열에서 old_text를 new_text로 바꿉니다. 문자열의 특정 텍스트를 바꾸려면 SUBSTITUTE를 사용합니다. 문자열의 특정 위치에 있는 텍스트를 바꾸려면 REPLACE를 사용합니다.

T(value)

- value가 참조하는 텍스트를 반환합니다.

TEXT(value,format_text)
- 값을 지정한 표시 형식의 텍스트로 변환합니다.

TRIM(text)

- 단어 사이에 있는 한 칸의 공백을 제외하고 텍스트의 공백을 모두 삭제합니다. 

VALUE(text)

- 텍스트 문자열을 숫자로 변환합니다.


 조회함수

ADDRESS(row_num,column_num,abs_num,a1,sheet_text)

- 주어진 행과 열 번호를 가지고 셀 주소를 나타내는 텍스트를 구합니다.

- abs_num : 1 또는 생략 절대 행과 열, 2 절대 행, 상대 열, 3 상대 행, 절대 열, 4 상대 행과 열 

AREAS(reference)

- 참조 영역에 있는 영역 수를 반환합니다. 영역은 인접한 셀의 범위 또는 단일 셀입니다.

CHOOSE(index_num,value1,value2,...)
- index_num을 사용하여 인수 값 목록에서 값을 반환합니다. CHOOSE 함수를 사용하여 29개까지의 값 중에서 인덱스 번호를 기준으로 한 개의 값을 선택할 수 있습니다.

COLUMN(reference) | ROW(reference)

- 주어진 참조의 열,열 번호를 반환합니다.

COLUMNS(array) | ROWS(array)

- 배열이나 참조에 들어 있는 열 ,행 수를 반환합니다.

HYPERLINK(link_location,friendly_name)

GETPIVOTDATA(data_field,pivot_table,field1,item1,field2,item2,...)

HLOOKUP(lookup_value,table_array,row_index_num,range_lookup)

VLOOKUP(lookup_value,table_array,col_index_num,range_lookup)
INDEX(array,row_num,column_num)

INDIRECT(ref_text,a1)
LOOKUP(lookup_value,table_array,row_index_num,range_lookup)

MATCH(lookup_value,lookup_array,match_type)

OFFSET(reference,rows,cols,height,width)

TRANSPOSE(array)
- 세로 셀 범위를 가로 범위로, 가로 셀 범위를 세로 범위로 바꾸어 반환합니다.

RTD(ProgID,server,topic1,[topic2],...)

 
외부함수 

SQL.REQUEST(connection_string,output_ref,driver_prompt,query_text,col_names_logical)

- SQL.REQUEST 함수는 외부 데이터 원본과 연결하여 워크시트에서 쿼리를 실행한 다음 매크로 프로그래밍을 사용하지 않고 결과를 배열로 표시합니다.

ex) SQL.REQUEST("DSN=NWind;DBQ=c:\msquery;FIL=dBASE4", c15, 2, "Select Custmr_ID, Due_Date from Orders WHERE order_Amt>100", TRUE)


정보함수 

CELL(info_type,reference)
- 참조 범위에서 첫째 셀의 서식, 위치 또는 내용에 대한 정보를 반환합니다.

- info_type

"address" 텍스트로 참조 영역에 있는 첫째 셀의 참조를 반환합니다. 
"col" 참조 영역에 있는 셀의 열 번호를 반환합니다. 
"color" 음수에 대해 색으로 서식을 지정한 셀에 대해서는 1, 그렇지 않은 셀에 대해서는 0을 반환합니다. 
"contents" 참조 영역에 있는 왼쪽 위 셀의 수식이 아닌 값을 반환합니다. 
"filename" 텍스트로 참조가 들어 있는 파일의 전체 경로를 포함한 파일 이름을 반환합니다. 참조가 들어 있는 워크시트를 저장하지 않은 경우에는 빈 텍스트("")를 반환합니다. 
"format" 셀의 숫자 서식에 해당하는 텍스트 값입니다. 여러 숫자 서식에 대한 텍스트 값은 아래 표에 나와 있습니다. 음수에 대해 색으로 서식을 지정한 셀에 대해서는 텍스트 값의 끝에 "-"를 반환합니다. 양수나 모든 값에 괄호로 서식을 지정한 셀에 대해서는 텍스트 값의 끝에 "0"을 반환합니다. 
"parentheses" 양수 또는 모든 값에 괄호로 서식을 지정한 셀에 대해서는 1, 그렇지 않은 셀에 대해서는 0을 반환합니다. 
"prefix" 셀의 "레이블 접두어"에 해당하는 텍스트 값으로 셀이 왼쪽 맞춤의 텍스트를 포함하면 작은 따옴표(')를, 오른쪽 맞춤의 텍스트를 포함하면 큰 따옴표(")를, 가운데 맞춤의 텍스트를 포함하면 캐럿(^)을, 양쪽 맞춤 텍스트를 포함하면 백슬래시(\)를, 그 밖의 경우는 빈 텍스트("")를 반환합니다. 
"protect" 셀이 잠겨 있지 않으면 0을, 잠겨 있으면 1을 반환합니다. 
"row" 참조 영역에 있는 셀의 행 번호를 반환합니다. 
"type" 셀의 데이터 형식에 해당하는 텍스트 값으로 셀이 비어 있으면 "b"를, 텍스트 상수를 포함하면 "l"을, 그 밖의 경우에는 "v"를 반환합니다. 
"width" 정수로 반올림한 셀의 열 너비를 반환합니다. 열 너비의 각 단위는 기본 글꼴 크기로 지정된 문자 하나의 너비와 같습니다. 


 INFO(type_text)

- 현재 사용하고 있는 운영 체제에 대한 정보를 반환합니다.

- type_text

"directory" 현재 디렉터리나 폴더의 경로입니다. 
"memavail" 사용할 수 있는 메모리 용량(바이트 단위)입니다. 
"memused" 데이터에 사용되는 메모리 용량입니다. 
"numfile" 열려 있는 통합 문서의 활성 워크시트 수입니다. 
"origin" "$A:"로 시작하는 텍스트로 표시되는 A1 스타일의 절대 참조입니다. Lotus 1-2-3 릴리스 3.x와의 호환을 위한 것입니다. 현재 위치에 따라 창에서 맨 위 가장 왼쪽에 표시된 셀에 대한 셀 참조를 반환합니다. 
"osversion" 현재 운영 체제의 버전을 텍스트로 나타냅니다. 
"recalc" 현재의 재계산 모드를 "자동" 또는 "수동"으로 반환합니다. 
"release" Microsoft Excel의 버전을 텍스트로 나타냅니다. 
"system" 운영 체제의 이름:
Macintosh = "mac"
Windows = "pcdos"  
"totmem" 사용 중인 메모리를 포함한 메모리의 총 용량(바이트 단위)입니다. 


ISBLANK(value)
ISERR(value) | ISERROR(value)
ISLOGICAL(value)
ISNA(value)
ISREF(value)
ISNUMBER(value) | ISTEXT(value) | ISNONTEXT(value)

ISEVEN(number) | ISODD(number)
- 숫자가 짝수, 홀수이면 TRUE를 반환하고, 짝수, 홀수이면 FALSE를 반환합니다.

N(value)

- 숫자로 변환된 값을 표시합니다.

TYPE(value)

- 값의 유형을 구합니다. 특정 셀의 값 유형에 따라 함수 실행이 달라질 때 TYPE 함수를 사용합니다. 

- value type : 숫자 1, 텍스트 2, 논리값 4, 오류값 16, 배열 64

 
논리함수

AND(logical1,logical2, ...)
- 인수가 모두 TRUE이면 TRUE를 반환하고, 인수들 중 하나라도 FALSE이면 FALSE를 반환합니다.

- IF(AND(1<A3, A3<100)

OR(logical1,logical2,...)

- 인수 중 하나가 TRUE이면 TRUE를, 모든 인수가 FALSE이면 FALSE를 반환합니다.

TRUE( ) | FALSE( )

- 논리값 TRUE, FALSE를 반환합니다

IF(logical_test,value_if_true,value_if_false)
- IF(A2>89,"A",IF(A2>79,"B", IF(A2>69,"C",IF(A2>59,"D","F"))))

NOT(logical)
- 인수 값의 역을 표시합니다. 값이 특정 값과 같지 않은지 확인할 때 NOT을 사용합니다.

 
데이타베이스함수

DAVERAGE(database,field,criteria) 
- 목록 또는 데이터베이스의 열에서 지정한 조건에 맞는 값의 평균을 계산합니다.

- database : 데이터베이스나 목록으로 지정할 셀 범위로서 데이터베이스는 레코드(관련 정보 행)와 필드(데이터 열)로 이루어진 관련 데이터 목록입니다. 목록의 첫째 행에는 각 열의 레이블이 있습니다.

- field : 함수에 사용되는 열을 지정합니다. "나이" 또는 "수확량"처럼 열 레이블을 큰따옴표로 묶어 입력하거나 첫째 열을 1, 둘째 열을 2 등 목록 내의 열 위치를 나타내는 숫자를 큰따옴표 없이 입력합니다.

- criteria : 지정한 조건이 있는 셀 범위입니다. 열 조건 지정하는 최소한의 열 레이블 하나와 그 아래에 최소한 한 셀이 포함되면 그 범위를 criteria 인수로 사용할 수 있습니다.

DCOUNT(database,field,criteria) | DCOUNTA(database,field,criteria)

- 목록 또는 데이터베이스의 열에서 지정한 조건에 맞는 숫자가 있는 셀의 개수를 구합니다. field 인수는 선택 사항입니다. field 인수를 생략하면 데이터베이스에서 조건에 맞는 모든 레코드 개수가 구해집니다.

DGET(database,field,criteria)
- 목록 또는 데이터베이스의 열에서 지정한 조건에 맞는 하나의 값을 추출합니다.

DMAX(database,field,criteria) | DMIN(database,field,criteria) 

DSUM(database,field,criteria)

DPRODUCT(database,field,criteria)

- 목록이나 데이터베이스의 열에서 지정한 조건에 맞는 값을 곱합니다.

 

통계함수

 

 AVERAGE(number1,number2,...)  | AVERAGEA(value1,value2,...)

COUNT(value1,value2,...) | COUNTA(value1,value2,...)
- 인수 목록에서 숫자가 포함된 셀과 숫자의 개수를 계산합니다. COUNT 함수를 사용하면 숫자 범위 또는 배열 내의 숫자 필드에 있는 항목 수를 구할 수 있습니다.

COUNTBLANK(range)

COUNTIF(range,criteria)

LARGE(array,k) | SMALL(array,k)

데이터 집합에서 k번째로 큰,작은 값을 구합니다. 이 함수를 사용하여 상대 순위 값을 선택할 수 있습니다. 

- Array :  k번째 큰 값을 결정할 데이터 배열 또는 범위입니다.
- K :  데이터의 배열이나 셀 범위에서 가장 큰 값과의 상대 순위입니다.
MAX(number1,number2,...) MAXA(value1,value2,...)

MEDIAN(number1,number2,...)
- 주어진 수들의 중간값을 반환합니다. 중간값은 수 집합에서 중간에 있는 수입니다. 즉, 수의 반은 중간값보다 큰 값을 가지고 나머지 반은 중간값보다 작은 값을 가집니다.

MIN(number1,number2,...) MINA(value1,value2,...)

MODE(number1,number2,...)
- 배열이나 데이터 범위에서 가장 빈도수가 높은 값을 반환합니다. MODE도 MEDIAN과 마찬가지로 대표값입니다.

Posted by marryjane
|

Stay - Palmy

Today's Song 2008. 9. 28. 21:44


AHT MEE FON TEE LON MAH CHUA KROW
LAE MEK KOW TEE PAAN MAH PIANG CHUA KEUN
JUR GUB LOM GAW PLEW PAI MAI MEE KRAI REU FEUN
MAI DAI PEN KWARM YOUNG YEUN SA MUR PAI
TAE GUB TUR TEE PAAN MAH CHUA KROW
LAE RUANG ROW TEE PLIEN PAI CHUA KARM KEUN
GUB ARAI TEE PEN PAI GAW YOUNG MAI KOEY LEUM
MEUAN WAH MUN PEN SUAN NEUNG KAUNG HUA JAI
 

* ROW MAI KOEY JA RUK GUN MEE TAE WUN TEE AUN WAI
PAAN LEREI PAI LAE MAI KOEY JA GLUB MAH
PEN KAE KWARM PRA TUP JAI TEE YOUNG KONG NAN NAH
MEE TAE FON MEE TAE FAR TEE KOW JAI 

** TAI TON MAI TEE MAI MEE ROM NGOW
GING GARN MUN MAI DAI SOONG SUK TOW RAI
TAE RARK LEUK LONG NAI DIN YOUNG LEUK LONG NAI JAI
MEE KWARM MAI TEE MARK MAI TA LAUD MAH
YOUNG RARK LEUK LONG NAI DIN YOUNG LEUK LONG NAI JAI
MEE KWARM MAI TEE MARK MAI…TA LAUD MAH

'Today's Song' 카테고리의 다른 글

Another Sad Song - Jasmin Tabatabai  (0) 2009.01.20
Blower's daughter - Damien Rice  (0) 2009.01.20
Falling Slowly - Glen Hansard  (0) 2009.01.19
If You Want Me - Marketa Irglova  (0) 2009.01.19
Tony Takitani - Ryuichi Sakamoto  (0) 2005.10.16
Posted by marryjane
|

문자열을 참조가능하게 해주는 함수
=indirect(a1 & b1 & "!f1")

'excel' 카테고리의 다른 글

[함수]문자열자르기 - SEARCH  (0) 2008.11.11
[함수]중복된 목록에서 데이터 불러오기  (0) 2008.10.02
[함수]파일 및 시트명  (0) 2008.09.30
[함수]엑셀함수  (0) 2008.09.30
[메크로]레이아웃 컨트롤  (0) 2008.08.06
Posted by marryjane
|

1. 초점

측정한 피사체와의 거리의 숫자를 왼쪽 그림에서 첫 번째 줄의 숫자와 두 번째 줄 삼각형과 맞추면 됩니다.

만약 조리개를 11에 맞추었다면, 포커스를 2m에 맞추었다 해도 1.5m 부터 3m 까지 촛점이 맞게 됩니다. 이것을 심도조절 이라고 하는데, 심도조절을 하여 촛점에 대한 허용도를 조리개를 조임으로써 높일 수 있습니다.


2. 노출

전자식 노출계는 LED가 3개 있는데, 가운데 LED에 불이 들어오면 적정, 위는 과다, 아래는 부족을 의미합니다.
노출계가 오른손 검지손가락에 의해 가려져 정확한 노출을 얻어내는데 실수할 수 있으므로 주의하시기 바랍니다.

* 노출계 작동여부 확인방법

필름 감도를 ISO 100 으로 선택하시고, 옥외라면, 조리개를 8 정도, 실내라면, 조리개를 5.6 정도에 놓으시고, 
반셔터를 누른상태 ( 한번 누르면 10 초정도 동작합니다 )에서, 셔터속도 조절 다이얼을 대충 30 ~ 250 사이에서 조정하다보면, 
위 또는 아래의 빨간불, 또는 적정노출인 가운데 파란불이 들어 올겁니다.

3. B셔터
B 셔터는, 셔터를 누르고 있는동안 셔터막이 열려 있는 기능을 가지고 있습니다.
조리개를 완전 개방하고, 셔터속도 조절 다이얼을 B 로 설정하고, 렌즈를 들여다 보며, 공셔터를 몇번 날려보시면 쉽게 이해가 갈겁니다.



'Rollei35se' 카테고리의 다른 글

Rollei35수리점  (0) 2009.10.11
필름 & 현상소  (0) 2009.01.22
Posted by marryjane
|

http://iilii.egloos.com/3788564

1. iterator 패턴은..

프로그래밍을 하다 보면, array나 List, Set, Map과 같은 애들을 많이 씁니다. 얘네들의 특징은 어떤 데이터들의 집합체라는 겁니다. 원래 집합체란 게 속에 뭐가 들었냐가 중요하죠. 그래서 집합체들을 다룰 때는 얘들이 가지고 있는 개별 원소에 대해서 이런 저런 작업들을 할 일이 많습니다.
iterator를 쓰게 되면, 집합체와 개별 원소들간에 분리시켜 생각할 수가 있습니다. 심지어는 그 집합체가 어떤 클래스의 인스턴스인지 조차 신경쓰지 않아도 됩니다.

2. 예제

package c01_iterator;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class MagicianList implements Iterable<String> {
        private List<String> list = new ArrayList<String>();

        public void add(String name){
                list.add(name);
        }

        public Iterator<String> iterator() {
                return  new Iterator<String>(){
                        int seq = 0;
                        public boolean hasNext() {
                                return  seq < list.size();
                        }
                        public String next() {
                                return list.get(seq++);
                        }
                        public void remove() {
                        }
                };
        }

        public static void main(String[] arg){
                MagicianList magicians = new MagicianList();
                magicians.add("이은결");
                magicians.add("Kevin parker");
                magicians.add("David Blaine");

                Iterator<String> iterator = magicians.iterator();
                while (iterator.hasNext()) {
                        String element = iterator.next();
                        System.out.println(element);
                }
        }
}



 먼저, main 함수의 황토색 부분을 보면, magicians 의 원소들을 뽑아내는데, magicians 라는 변수를 전혀 쓰지 않습니다. 물론, 내부적으로 iterator라는 변수가 magicians와 관계를 유지해주고 있긴합니다만, 일단 iterator를 가지고 온 후에는 데이터 집합체가 뭐냐에 신경을 쓸 필요가 없어진 거죠. iterator만 가져오면, 걍 hasNext() , next() 만 가지고 반복하면서 원소들에 대해서 처리를 하면 됩니다.

3. Iterator관련 interface

소스 코드의 보라색 부분이 jdk 안에 있는 Iterator에 관한 부분입니다.
java.util.Iterable 이란 넘을 구현하고 있습니다. 고놈한테는 Iterator<E> iterator() 라는 메소드 한개만 있습니다. 뭔소리냐면, 이 클래스는 무슨무슨 집합체 데이터를 가꾸 있으니깐, iterator로 원소들을 뽑아다가 쓸 수 있도록 제공하겠다는거죠.

그담에 등장하는 것이 java.util.Iterator입니다. 소스 코드의 청록색 부분입니다.
method가 3개가 있죠? hasNext()는 다음 구성 요소가 있냐고 물어봅니다. next()는 그 요소를 뽑아옵니다. remove()는 일부러 구현을 안했습니다. API에 보면, 마지막으로 꺼낸 요소를 제거한다.(optional operation) 이라고 되어있습니다. optional이라는 걸 강조할라고 구현 안했습니다. 그리고 iterator를 돌면서 데이터를 삭제한다는 것은 그다지 바람직해 보이진 않습니다.
요기서 한가지 집고 넘어가야 할 것은 시퀀스는 hasNext()가 아니라 next()에서 증가시켜야 한다는 것입니다. 좀 비상식적인 얘기긴 합니다만, hasNext()를 호출하고 또 호출하는 일이 발생할 수도 있기 때문이죠. hasNext라는 메소드 이름이, next를 가지고 있는지를 체크하겠다는 것이니까요.

4. JAVA API에 있는 Iterator

우리가 알고 있는 일반적인 집합체들은 전부 Iterator를 제공합니다. Set, List 등은 Collection 을 상속 받는데, Collection이 Iteratable을 상속 받기 때문입니다.
위에서 청록색 부분을 list.iterator() 라고 쭐여버려도 됩니다. 걍 있는 거 안 쓰고 굳이 구현한 건 예제 파일을 함 보여줄라고 한 겁니다. 사실은 예제 전체가 억지로 만들어낸 겁니다. 일반적인 집합체를 구현해서 쓰는 일은 거의 없고, JDK 안에 들어 있는 애들을 가져다 쓰는데, 걔들은 거의 대부분 Iterator를 제공하거든요.(Map은 한 다리 건너서 제공합니다.) 그래서 Iterator를 직접 구현할 일은 거의 없습니다. 가져다가 쓸 일이 있을 뿐이죠.

이제 Map은 왜 Iterator를 제공하지 않는 지를 살펴보죠. Map은 Set이나 List와는 달리 key-value의 구조입니다. key에 대한 Iterator인지 value에 대한 Iterator인지 구별할 방법이 없죠. 그래서 아예 제공을 안 합니다. 그러나 Map에는 key에 대해서는 Set<K> keySet()이라는 key를 Set으로 가져오기를 지원하고, value에 대해서는 Collection<V> values() 를 제공합니다. 위에서 말씀드렸다시피 Set과 Collection은 둘다 Iterator를 제공합니다.

5. Enumeration vs Iterator

둘은 굉장히 유사합니다. Enumeration의 경우는 boolean hasMoreElements() 와 E nextElement() 를 제공합니다. Iterator의 hasNext() , next() 에 대응되는 메쏘드들이죠.
차이는 두 가집니다. 첫째 Iterator에는 remove()가 있다. 둘째, Iterator의 함수 이름이 훨씬 쉽다.(타이핑 노가다가 쭐어든다.-_-; )
처음에 Enumeration이 나왔고, 그걸 쫌 편하게 만들어보자한 것이 Iterator랍니다.

'java' 카테고리의 다른 글

S-DES 소스 - java  (0) 2009.10.01
POI - 시트복사  (0) 2008.11.20
The Java XML Validation API - IBM developerworks  (0) 2008.09.19
Heap Dump 생성  (0) 2008.09.18
VM 분석 : Chapter 1 Performance - 2 / -Xrunprof 옵션  (0) 2008.09.17
Posted by marryjane
|


http://www-128.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html?ca=dnw-727#listing1

08 Aug 2006

Validation reports whether a document adheres to the rules specified by the schema. Different parsers and tools support different schema languages such as DTDs, the W3C XML Schema Language, RELAX NG, and Schematron. Java 5™ adds a uniform validation Application Programming Interface (API) that can compare documents to schemas written in these and other languages. Learn about this XML validation API.

Validation is a powerful tool. It enables you to quickly check that input is roughly in the form you expect and quickly reject any document that is too far away from what your process can handle. If there's a problem with the data, it's better to find out earlier than later.

In the context of Extensible Markup Language (XML), validation normally involves writing a detailed specification for the document's contents in any of several schema languages such as the World Wide Web Consortium (W3C) XML Schema Language (XSD), RELAX NG, Document Type Definitions (DTDs), and Schematron. Sometimes validation is performed while parsing, sometimes immediately after. However, it's usually done before any further processing of the input takes place. (This description is painted with broad strokes -- there are exceptions.)

Until recently, the exact Application Programming Interface (API) by which programs requested validation varied with the schema language and parser. DTDs and XSD were normally accessed as configuration options in Simple API for XML (SAX), Document Object Model (DOM), and Java™ API for XML Processing (JAXP). RELAX NG required a custom library and API. Schematron might use the Transformations API for XML(TrAX); and still other schema languages required programmers to learn still more APIs, even though they were performing essentially the same operation.

Java 5 introduced the javax.xml.validation package to provide a schema-language-independent interface to validation services. This package is also available in Java 1.3 and later when you install JAXP 1.3 separately. Among other products, an implementation of this library is included with Xerces 2.8.

Validation

The javax.xml.validation API uses three classes to validate documents: SchemaFactory, Schema, and Validator. It also makes extensive use of the javax.xml.transform.Source interface from TrAX to represent the XML documents. In brief, a SchemaFactory reads the schema document (often an XML file) from which it creates a Schema object. The Schema object creates a Validator object. Finally, the Validator object validates an XML document represented as a Source.

Listing 1 shows a simple program to validate a URL entered on the command line against the DocBook XSD schema.


Listing 1. Validating an Extensible Hypertext Markup Language (XHTML) document
import java.io.*;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import org.xml.sax.SAXException;

public class DocbookXSDCheck {

    public static void main(String[] args) throws SAXException, IOException {

        // 1. Lookup a factory for the W3C XML Schema language
        SchemaFactory factory = 
            SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
        
        // 2. Compile the schema. 
        // Here the schema is loaded from a java.io.File, but you could use 
        // a java.net.URL or a javax.xml.transform.Source instead.
        File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
        Schema schema = factory.newSchema(schemaLocation);
    
        // 3. Get a validator from the schema.
        Validator validator = schema.newValidator();
        
        // 4. Parse the document you want to check.
        Source source = new StreamSource(args[0]);
        
        // 5. Check the document
        try {
            validator.validate(source);
            System.out.println(args[0] + " is valid.");
        }
        catch (SAXException ex) {
            System.out.println(args[0] + " is not valid because ");
            System.out.println(ex.getMessage());
        }  
        
    }

}

Here's some typical output when checking an invalid document using the version of Xerces bundled with Java 2 Software Development Kit (JDK) 5.0:

file:///Users/elharo/CS905/Course_Notes.xml is not valid because cvc-complex-type.2.3: Element 'legalnotice' cannot have character [children], because the type's content type is element-only.

You can easily change the schema to validate against, the document to validate, and even the schema language. However, in all cases, validation follows these five steps:

  1. Load a schema factory for the language the schema is written in.
  2. Compile the schema from its source.
  3. Create a validator from the compiled schema.
  4. Create a Source object for the document you want to validate. A StreamSource is usually simplest.
  5. Validate the input source. If the document is invalid, the validate() method throws a SAXException. Otherwise, it returns quietly.

You can reuse the same validator and the same schema multiple times in series. However, neither class is thread-safe or reentrant. If you validate in multiple threads simultaneously, make sure each one has its own Validator and Schema objects.

Validate against a document-specified schema

Some documents specify the schema they expect to be validated against, typically using xsi:noNamespaceSchemaLocation and/or xsi:schemaLocation attributes like this:

<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="http://www.example.com/document.xsd">
  ...

If you create a schema without specifying a URL, file, or source, then the Java language creates one that looks in the document being validated to find the schema it should use. For example:

SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema();

However, normally this isn't what you want. Usually the document consumer should choose the schema, not the document producer. Furthermore, this approach works only for XSD. All other schema languages require an explicitly specified schema location.



Back to top


Abstract factories

SchemaFactory is an abstract factory. The abstract factory design pattern enables this one API to support many different schema languages and object models. A single implementation usually supports only a subset of the numerous languages and models. However, once you learn the API for validating DOM documents against RELAX NG schemas (for instance), you can use the same API to validate JDOM documents against W3C schemas.

For example, Listing 2 shows a program that validates DocBook documents against DocBook's RELAX NG schema. It's almost identical to Listing 1. The only things that have changed are the location of the schema and the URL that identifies the schema language.


Listing 2. Validating a DocBook document using RELAX NG
import java.io.*;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import org.xml.sax.SAXException;

public class DocbookRELAXNGCheck {

    public static void main(String[] args) throws SAXException, IOException {

        // 1. Specify you want a factory for RELAX NG
        SchemaFactory factory 
         = SchemaFactory.newInstance("http://relaxng.org/ns/structure/1.0");
        
        // 2. Load the specific schema you want. 
        // Here I load it from a java.io.File, but we could also use a 
        // java.net.URL or a javax.xml.transform.Source
        File schemaLocation = new File("/opt/xml/docbook/rng/docbook.rng");
        
        // 3. Compile the schema.
        Schema schema = factory.newSchema(schemaLocation);
    
        // 4. Get a validator from the schema.
        Validator validator = schema.newValidator();
        
        // 5. Parse the document you want to check.
        String input 
         = "file:///Users/elharo/Projects/workspace/CS905/build/Java_Course_Notes.xml";
        
        // 6. Check the document
        try {
            validator.validate(source);
            System.out.println(input + " is valid.");
        }
        catch (SAXException ex) {
            System.out.println(input + " is not valid because ");
            System.out.println(ex.getMessage());
        }  
        
    }

}

If you run this program with the stock Sun JDK and no extra libraries, you'll probably see something like this:

Exception in thread "main" java.lang.IllegalArgumentException: 
http://relaxng.org/ns/structure/1.0
	at javax.xml.validation.SchemaFactory.newInstance(SchemaFactory.java:186)
	at DocbookRELAXNGCheck.main(DocbookRELAXNGCheck.java:14)

This is because, out of the box, the JDK doesn't include a RELAX NG validator. When the schema language isn't recognized, SchemaFactory.newInstance() throws an IllegalArgumentException. However, if you install a RELAX NG library such as Jing and a JAXP 1.3 adapter, then it should produce the same answer the W3C schema does.

Identify the schema language

The javax.xml.constants class defines several constants to identify schema languages:

  • XMLConstants.W3C_XML_SCHEMA_NS_URI: http://www.w3.org/2001/XMLSchema
  • XMLConstants.RELAXNG_NS_URI: http://relaxng.org/ns/structure/1.0
  • XMLConstants.XML_DTD_NS_URI: http://www.w3.org/TR/REC-xml

This isn't a closed list. Implementations are free to add other URLs to this list to identify other schema languages. Typically, the URL is the namespace Uniform Resource Identifier (URI) for the schema language. For example, the URL http://www.ascc.net/xml/schematron identifies Schematron schemas.

Sun's JDK 5 only supports XSD schemas. Although DTD validation is supported, it isn't accessible through the javax.xml.validation API. For DTDs, you have to use the regular SAX XMLReader class. However, you can install additional libraries that add support for these and other schema languages.

How schema factories are located

The Java programming language isn't limited to a single schema factory. When you pass a URI identifying a particular schema language to SchemaFactory.newInstance(), it searches the following locations in this order to find a matching factory:

  1. The class named by the "javax.xml.validation.SchemaFactory:schemaURL" system property
  2. The class named by the "javax.xml.validation.SchemaFactory:schemaURL" property found in the $java.home/lib/jaxp.properties file
  3. javax.xml.validation.SchemaFactory service providers found in the META-INF/services directories of any available Java Archive (JAR) files
  4. A platform default SchemaFactory, com.sun.org.apache.xerces.internal.jaxp.validation.xs.SchemaFactoryImpl in JDK 5

To add support for your own custom schema language and corresponding validator, all you have to do is write subclasses of SchemaFactory, Schema, and Validator that know how to process your schema language. Then, install your JAR in one of these four locations. This is useful for adding constraints that are more easily checked in a Turing-complete language like Java than in a declarative language like the W3C XML Schema language. You can define a mini-schema language, write a quick implementation, and plug it into the validation layer.



Back to top


Error handlers

The default response from a schema is to throw a SAXException if there's a problem and do nothing if there isn't. However, you can provide a SAX ErrorHandler to receive more detailed information about the document's problems. For example, suppose you want to log all validation errors, but you don't want to stop processing when you encounter one. You can install an error handler such as that in Listing 3.


Listing 3. An error handler that merely logs non-fatal validity errors
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

public class ForgivingErrorHandler implements ErrorHandler {

    public void warning(SAXParseException ex) {
        System.err.println(ex.getMessage());
    }

    public void error(SAXParseException ex) {
        System.err.println(ex.getMessage());
    }

    public void fatalError(SAXParseException ex) throws SAXException {
        throw ex;
    }

}

To install this error handler, you create an instance of it and pass that instance to the Validator's setErrorHandler() method:

  ErrorHandler lenient = new ForgivingErrorHandler();
  validator.setErrorHandler(lenient);



Back to top


Schema augmentation

Some schemas do more than validate. As well as providing a true-false answer to the question of whether a document is valid, they also augment the document with additional information. For example, they can provide default attribute values. They might also assign types like int or gYear to an element or attribute. The validator can create such type-augmented documents and write them onto a javax.xml.transform.Result object. All you need to do is pass a Result as the second argument to validate. For example, Listing 4 both validates an input document and creates an augmented DOM document from the combination of the input with the schema.


Listing 4. Augmenting a document with a schema
import java.io.*;
import javax.xml.transform.dom.*;
import javax.xml.validation.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;

public class DocbookXSDAugmenter {

    public static void main(String[] args) 
      throws SAXException, IOException, ParserConfigurationException {

        SchemaFactory factory 
         = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
        File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
        Schema schema = factory.newSchema(schemaLocation);
        Validator validator = schema.newValidator();
        
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true); // never forget this
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse(new File(args[0]));
        
        DOMSource source = new DOMSource(doc);
        DOMResult result = new DOMResult();
        
        try {
            validator.validate(source, result);
            Document augmented = (Document) result.getNode();
            // do whatever you need to do with the augmented document...
        }
        catch (SAXException ex) {
            System.out.println(args[0] + " is not valid because ");
            System.out.println(ex.getMessage());
        }  
        
    }

}

This procedure can't transform an arbitrary source into an arbitrary result. It doesn't work at all for stream sources and results. SAX sources can be augmented into SAX results, and DOM sources into DOM results; but SAX sources can't be augmented to DOM results or vice versa. If you need to do that, first augment into the matching result -- SAX for SAX and DOM for DOM -- and then use TrAX's identity transform to change the model.

This technique isn't recommended, though. Putting all the information the document requires in the instance is far more reliable than splitting it between the instance and the schema. You might validate, but not everyone will.



Back to top


Type information

The W3C XML Schema Language is heavily based on the notion of types. Elements and attributes are declared to be of type int, double, date, duration, person, PhoneNumber, or anything else you can imagine. The Java Validation API includes a means to report such types, although it's surprisingly independent of the rest of the package.

Types are identified by an org.w3c.dom.TypeInfo object. This simple interface, summarized in Listing 5, tells you the local name and namespace URI of a type. You can also tell whether and how a type is derived from another type. Beyond that, understanding the type is up to your program. The Java language doesn't tell you what it means or convert the data to a Java type such as double or java.util.Date.


Listing 5. The DOM TypeInfo interface
package org.w3c.dom;

public interface TypeInfo {

  public static final int DERIVATION_RESTRICTION;
  public static final int DERIVATION_EXTENSION;
  public static final int DERIVATION_UNION;

  public String  getTypeName();
  public String  getTypeNamespace()
  public boolean isDerivedFrom(String namespace, String name, int derivationMethod);

}

To get TypeInfo objects, you ask the Schema object for a ValidatorHandler rather than a Validator. ValidatorHandler implements SAX's ContentHandler interface. Then, you install this handler in a SAX parser.

You also install your own ContentHandler in the ValidatorHandler (not the parser); the ValidatorHandler will forward the augmented events on to your ContentHandler.

The ValidatorHandler makes available a TypeInfoProvider that your ContentHandler can call at any time to find out the type of the current element or one of its attributes. It can also tell you whether an attribute is an ID, and whether the attribute was explicitly specified in the document or defaulted in from the schema. Listing 6 summarizes this class.


Listing 6. The TypeInfoProvider class
package javax.xml.validation;

public abstract class TypeInfoProvider {

  public abstract TypeInfo getElementTypeInfo();
  public abstract TypeInfo getAttributeTypeInfo(int index);
  public abstract boolean  isIdAttribute(int index);
  public abstract boolean  isSpecified(int index);

}

Finally, you parse the document with the SAX XMLReader. Listing 7 shows a simple program that uses all these classes and interfaces to print out the names of all the types of the elements in a document.


Listing 7. Listing element types
import java.io.*;
import javax.xml.validation.*;

import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class TypeLister extends DefaultHandler {

    private TypeInfoProvider provider;
    
    public TypeLister(TypeInfoProvider provider) {
        this.provider = provider;
    }

    public static void main(String[] args) throws SAXException, IOException {

        SchemaFactory factory 
         = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
        File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
        Schema schema = factory.newSchema(schemaLocation);
    
        ValidatorHandler vHandler = schema.newValidatorHandler();
        TypeInfoProvider provider = vHandler.getTypeInfoProvider();
        ContentHandler   cHandler = new TypeLister(provider);
        vHandler.setContentHandler(cHandler);
        
        XMLReader parser = XMLReaderFactory.createXMLReader();
        parser.setContentHandler(vHandler);
        parser.parse(args[0]);
        
    }
    
    public void startElement(String namespace, String localName,
      String qualifiedName, Attributes atts) throws SAXException {
        String type = provider.getElementTypeInfo().getTypeName();
        System.out.println(qualifiedName + ": " + type);
    }

}

Here's the start of the output from running this code on a typical DocBook document:

book: #AnonType_book
title: #AnonType_title
subtitle: #AnonType_subtitle
info: #AnonType_info
copyright: #AnonType_copyright
year: #AnonType_year
holder: #AnonType_holder
author: #AnonType_author
personname: #AnonType_personname
firstname: #AnonType_firstname
othername: #AnonType_othername
surname: #AnonType_surname
personblurb: #AnonType_personblurb
para: #AnonType_para
link: #AnonType_link

As you can see, the DocBook schema assigns most elements anonymous complex types. Obviously, this will vary from one schema to the next.



Back to top


Conclusion

The world would be a poorer place if everyone spoke just one language. Programmers would be unhappy if they had only one programming language to choose from. Different languages suit different tasks better, and some tasks require more than one language. XML schemas are no different. You can choose from a plethora of useful schema languages. In Java 5 with javax.xml.validation, you have an API that can handle all of them.


'java' 카테고리의 다른 글

POI - 시트복사  (0) 2008.11.20
자바 디자인 패턴 1 - Iterator  (0) 2008.09.24
Heap Dump 생성  (0) 2008.09.18
VM 분석 : Chapter 1 Performance - 2 / -Xrunprof 옵션  (0) 2008.09.17
java.lang.OutOfMemoryError - OOME  (0) 2008.09.17
Posted by marryjane
|