며칠간 뚝딱거려서 만든 XMLCPP Library의 최초 버전을 release하였습니다.
라이브러리의 홈페이지에서 간단한 사용법을 보실 수 있습니다.
라이브러리가 지원하는 표준은 다음과 같습니다.
현재 DTD를 사용한 validation은 구현되어 있지 않습니다. 간단히 말하면 non-validating XML pull parser입니다. 물론 DTD에 대한 문법 검사는 수행합니다. ((이 기능은 Roadmap에 따라 차후 구현될 예정입니다.))
Entity ref를 위한 name/value pair는 XmlPull v1 API에 정의되어 있는 define_entity_replacement_text(name, text)를 사용하여 수동으로 입력하여 사용할 수 있습니다.
이 XMLCPP Library를 사용하기 위해서는 다음의 두 라이브러리가 필요합니다. ((둘 다 Windows 환경에서도 사용 가능합니다만 아직 Windows로의 포팅 작업은 이루어지지 않았습니다. Roadmap 부분을 참고하세요.))
구현된 PullParser의 간단한 사용예는 다음과 같습니다.
위의 코드는 PullParser의 next()함수를 사용한 것으로 next()함수는 다음 4개의 event_type만 리턴합니다.
next()함수에서는 "<ABC>"라는 문자열은 하나의 TEXT event로 리턴되며 get_text()의 값은 ""가 됩니다.
next() 함수보다 좀 더 자세한 내용이 필요하다면 next_token()함수를 사용할 수 있습니다. 이 함수는 next()가 리턴하는 event_type에 더해 다음을 추가로 리턴합니다.
위에서 예를 든 "<ABC>"라는 문자열은 next_token()함수를 사용하면 ENTITY_REF, TEXT, ENTITY_REF 이렇게 3개의 event_type으로 나누어져서 리턴됩니다. 각 ENTITY_REF event의 경우에는 get_raw_text()에서는 "<"를, get_text()에서는 "<"을 리턴합니다. ENTITY_REF이 유일하게 get_raw_text()와 get_text()가 다른 값을 리턴하는 event_type입니다.
현재 Linux 환경에서만 test되었으며 다음과 같은 roadmap을 가지고 작업할 예정입니다.
다운로드는 여기서 할 수 있습니다.
XMLCPP Library 개발에 관심 있으신 분들은 참여해 주세요. 특히 현재 위의 2번 항목 VC++로의 포팅에 도움이 필요할 듯 합니다. 한번 해봤는데 오랫만에 VC++를 사용하려니 잘 안되더군요. :-| 참고로 libiconv 라이브러리는 Windows용도 있습니다.
라이브러리의 홈페이지에서 간단한 사용법을 보실 수 있습니다.
라이브러리가 지원하는 표준은 다음과 같습니다.
- XmlPull v1 API
- XML InfoSet의 모든 문법
- XML Namespaces
- XML Recommendation에 정의된 CharClasses
현재 DTD를 사용한 validation은 구현되어 있지 않습니다. 간단히 말하면 non-validating XML pull parser입니다. 물론 DTD에 대한 문법 검사는 수행합니다. ((이 기능은 Roadmap에 따라 차후 구현될 예정입니다.))
Entity ref를 위한 name/value pair는 XmlPull v1 API에 정의되어 있는 define_entity_replacement_text(name, text)를 사용하여 수동으로 입력하여 사용할 수 있습니다.
Requirements
이 XMLCPP Library를 사용하기 위해서는 다음의 두 라이브러리가 필요합니다. ((둘 다 Windows 환경에서도 사용 가능합니다만 아직 Windows로의 포팅 작업은 이루어지지 않았습니다. Roadmap 부분을 참고하세요.))
Usage
구현된 PullParser의 간단한 사용예는 다음과 같습니다.
using namespace xmlcpp;
try {
fstream fs(filename);
fs.exceptions (ios_base::badbit);
PullParser pp;
pp.set_input(fs, encoding);
while (pp.next() != PullParser::END_DOCUMENT) {
wcout << PullParser::event_type_c_str(pp.get_event_type()) << L": " << endl;
switch (pp.get_event_type()) {
case PullParser::START_TAG:
wcout << L"tname="" << pp.get_name() << L""" << endl;
for (int i = 0; i < pp.get_attr_size(); ++i) {
wcout << L"tt" << pp.get_attr_name(i)
<< L"="" << pp.get_attr_value(i) << L""" << endl;
}
break;
case PullParser::END_TAG:
wcout << L"tname="" << pp.get_name() << L""" << endl;
break;
case PullParser::TEXT:
wcout << L"ttext="" << pp.get_text() << L""" << endl;
break;
default:
wcout << L"ttext="" << pp.get_raw_text() << L""" << endl;
break;
}
}
wcout << L"END_DOCUMENT: " << endl;
}
catch (exception& ex) {
wcout << ex.what() << endl;
}
위의 코드는 PullParser의 next()함수를 사용한 것으로 next()함수는 다음 4개의 event_type만 리턴합니다.
- START_TAG
- TEXT
- END_TAG
- END_DOCUMENT
next()함수에서는 "<ABC>"라는 문자열은 하나의 TEXT event로 리턴되며 get_text()의 값은 "
next() 함수보다 좀 더 자세한 내용이 필요하다면 next_token()함수를 사용할 수 있습니다. 이 함수는 next()가 리턴하는 event_type에 더해 다음을 추가로 리턴합니다.
- START_DOCUMENT
- IGNORABLE_WHITESPACE
- CDSECT
- PROCESSING_INSTRUCTION
- COMMENT
- ENTITY_REF
- DOCDECL
위에서 예를 든 "<ABC>"라는 문자열은 next_token()함수를 사용하면 ENTITY_REF, TEXT, ENTITY_REF 이렇게 3개의 event_type으로 나누어져서 리턴됩니다. 각 ENTITY_REF event의 경우에는 get_raw_text()에서는 "<"를, get_text()에서는 "<"을 리턴합니다. ENTITY_REF이 유일하게 get_raw_text()와 get_text()가 다른 값을 리턴하는 event_type입니다.
using namespace xmlcpp;
try {
fstream fs(filename);
fs.exceptions (ios_base::badbit);
PullParser pp;
pp.set_input(fs, encoding);
while (pp.next_token() != PullParser::END_DOCUMENT) {
wcout << PullParser::event_type_c_str(pp.get_event_type()) << L": " << endl;
switch (pp.get_event_type()) {
case PullParser::START_DOCUMENT:
wcout << L"tversion="" << pp.get_version() << L""" << endl;
wcout << L"tencoding="" << pp.get_encoding() << L""" << endl;
wcout << L"tstandalone"" << pp.get_standalone() << L""" << endl;
break;
case PullParser::START_TAG:
wcout << L"tname="" << pp.get_name() << L""" << endl;
for (int i = 0; i < pp.get_attr_size(); ++i) {
wcout << L"tt" << pp.get_attr_name(i)
<< L"="" << pp.get_attr_value(i) << L""" << endl;
}
break;
case PullParser::END_TAG:
wcout << L"tname="" << pp.get_name() << L""" << endl;
break;
case PullParser::TEXT:
wcout << L"ttext="" << pp.get_raw_text() << L""" << endl;
break;
case PullParser::IGNORABLE_WHITESPACE:
break;
case PullParser::CDSECT:
wcout << L"ttext="" << pp.get_raw_text() << L""" << endl;
break;
case PullParser::PROCESSING_INSTRUCTION:
wcout << L"ttext="" << pp.get_raw_text() << L""" << endl;
break;
case PullParser::COMMENT:
wcout << L"ttext="" << pp.get_raw_text() << L""" << endl;
break;
case PullParser::ENTITY_REF:
wcout << L"ttext="" << pp.get_raw_text() << L""" << endl;
break;
case PullParser::DOCDECL:
wcout << L"ttext="" << pp.get_raw_text() << L""" << endl;
break;
default:
wcout << L"ttext="" << pp.get_raw_text() << L""" << endl;
break;
}
}
wcout << L"END_DOCUMENT: " << endl;
}
catch (exception& ex) {
wcout << ex.what() << endl;
}
Roadmap
현재 Linux 환경에서만 test되었으며 다음과 같은 roadmap을 가지고 작업할 예정입니다.
- XmlPull v1 API의 Serializer 구현 (writing XML)
- MS VC++에서 사용 가능하도록 포팅
- DTD를 이용한 validation 구현
- PullParser를 이용한 SAX parser 구현
- SAX parser를 이용한 DOM 구현
- DOM을 이용한 XPath 및 기타 기능 구현
Downloads
다운로드는 여기서 할 수 있습니다.
Help Wanted
XMLCPP Library 개발에 관심 있으신 분들은 참여해 주세요. 특히 현재 위의 2번 항목 VC++로의 포팅에 도움이 필요할 듯 합니다. 한번 해봤는데 오랫만에 VC++를 사용하려니 잘 안되더군요. :-| 참고로 libiconv 라이브러리는 Windows용도 있습니다.
Comments
Post a Comment