30#if !__DCL_WINDOWS && defined(XML_UNICODE_WCHAR_T)
31 #error "You must not define XML_UNICODE_WCHAR_T for UNIX Operating System"
43 const XML_LChar* psz = XML_ErrorString(XML_GetErrorCode(_parser));
44 const wchar_t* wpsz =
NULL;
45#ifdef XML_UNICODE_WCHAR_T
49 String str = decoder.decode(psz);
52 __message = String::format(
53 __T(
"%ls at line %d"),
55 XML_GetCurrentLineNumber(_parser)
66void XmlDefaultHandler::startElement(
67 void* _userData,
const XML_Char* _name,
const XML_Char** _attrs)
69#ifdef XML_UNICODE_WCHAR_T
71 StringStringArray attrs;
73 String key = *_attrs++;
74 String value = *_attrs++;
79 String name = decoder.decode(_name);
80 StringStringArray attrs;
82 String key = decoder.decode(*_attrs++);
83 String value = decoder.decode(*_attrs++);
88 pHandler->startElement(name, attrs);
91void XmlDefaultHandler::endElement(
92 void* _userData,
const XML_Char* _name)
94#ifdef XML_UNICODE_WCHAR_T
98 String name = decoder.decode(_name);
100 XmlDefaultHandler* pHandler = (XmlDefaultHandler*) _userData;
101 pHandler->endElement(name);
104void XmlDefaultHandler::characters(
105 void* _userData,
const XML_Char* _chars,
int _len)
107#ifdef XML_UNICODE_WCHAR_T
108 String chars(_chars, _len);
111 String chars = decoder.decode(_chars, _len);
114 XmlDefaultHandler* pHandler = (XmlDefaultHandler*) _userData;
115 pHandler->characters(chars);
118void XmlDefaultHandler::startElement(
119 const String& _name,
const StringStringArray& _attrs)
121 __DCL_TRACE2(
__T(
"startElement[%ls], attrs[%ls]\n"), _name.data(), _attrs.toString().data());
124void XmlDefaultHandler::endElement(
130void XmlDefaultHandler::characters(
131 const String& _chars)
140 __parser = XML_ParserCreate(
NULL);
145 XML_ParserFree(__parser);
152 XML_SetElementHandler(
154 XmlDefaultHandler::startElement,
155 XmlDefaultHandler::endElement
157 XML_SetCharacterDataHandler(
159 XmlDefaultHandler::characters
162 XML_SetUserData(__parser, &_handler);
164 XML_Status status = XML_Parse(
171 if (status == XML_STATUS_ERROR)
202 r.append(
__T(
"<")).append(__name);
204 for (StringStringArray::ConstIterator it = __attrs.begin();
205 it != __attrs.end(); it++) {
206 r.append(
__T(
" ")).append((*it).key).append(
__T(
"=\""))
207 .append(String::escape((*it).value, (*it).value.length(), String::ESCAPE_XML))
211 if (__children.isEmpty()) {
217 .append(
__T(
"</")).append(__name).append(
__T(
">"));
225 const String& _name,
const StringStringArray& _attrs)
234 for (PointerArray::Iterator it = __children.begin();
235 it != __children.end(); it++) {
242 __children.add(pNode);
249 for (PointerArray::ConstIterator it = __children.begin();
250 it != __children.end(); it++) {
267 for (PointerArray::ConstIterator it = __children.begin();
268 it != __children.end(); it++) {
272 r.append(String::escape(s, s.length(), String::ESCAPE_XML));
294 __pCurrentElement =
NULL;
295 __pTopElement =
NULL;
301 delete __pTopElement;
303 __pTopElement =
NULL;
308void XmlDocument::startElement(
const String& _name,
const StringStringArray& _attrs)
312 __pTopElement = pElement;
316 __pCurrentElement = pElement;
319void XmlDocument::endElement(
const String& _name)
321 __DCL_ASSERT(__pCurrentElement !=
NULL && __pCurrentElement->name() == _name);
323 XmlNode* pParentNode = __pCurrentElement->parentNode();
325 if (__pCurrentElement != __pTopElement) {
330 __pCurrentElement = (XmlElement*) pParentNode;
333void XmlDocument::characters(
const String& _chars)
335 XmlCharsNode* pCharsNode =
new XmlCharsNode(__pCurrentElement, _chars);
336 __pCurrentElement->addChildNode(pCharsNode);
#define __DCL_TRACE1(fmt, arg1)
#define CLASSINFO(class_name)
#define __DCL_ASSERT(expr)
#define IMPLEMENT_CLASSINFO(class_name, base_class_name)
#define __DCL_TRACE2(fmt, arg1, arg2)
virtual String toString() const
bool isInstanceOf(const std::type_info &typeinfo) const
virtual String toString() const
XmlCharsNode(XmlNode *_pParentNode, const String &_chars)
virtual String toString() const
XmlElement(XmlNode *_pParentNode, const String &_name, const StringStringArray &_attrs)
const String innerText() const
virtual String toString() const
const String innerXml() const
void addChildNode(XmlNode *pNode)
virtual String toString() const
XmlException(XML_Parser _parser)
XmlNode(XmlNode *_pParentNode)
void parse(const ByteString &_data, XmlDefaultHandler &_handler) __DCL_THROWS1(XmlException *)