30#if !defined(__WINNT__) && defined(XML_UNICODE_WCHAR_T)
31 #error "You must not define XML_UNICODE_WCHAR_T for UNIX Operating System"
34#if __DCL_HAVE_THIS_FILE__
45 const XML_LChar* psz = XML_ErrorString(XML_GetErrorCode(_parser));
46 const wchar_t* wpsz =
NULL;
47#ifdef XML_UNICODE_WCHAR_T
51 String str = decoder.decode(psz);
54 __message = String::format(
55 __T(
"%ls at line %d"),
57 XML_GetCurrentLineNumber(_parser)
68void XmlDefaultHandler::startElement(
69 void* _userData,
const XML_Char* _name,
const XML_Char** _attrs
72#ifdef XML_UNICODE_WCHAR_T
74 StringStringArray attrs;
76 String key = *_attrs++;
77 String value = *_attrs++;
82 String name = decoder.decode(_name);
83 StringStringArray attrs;
85 String key = decoder.decode(*_attrs++);
86 String value = decoder.decode(*_attrs++);
91 pHandler->startElement(name, attrs);
94void XmlDefaultHandler::endElement(
95 void* _userData,
const XML_Char* _name
98#ifdef XML_UNICODE_WCHAR_T
102 String name = decoder.decode(_name);
104 XmlDefaultHandler* pHandler = (XmlDefaultHandler*) _userData;
105 pHandler->endElement(name);
108void XmlDefaultHandler::characters(
109 void* _userData,
const XML_Char* _chars,
int _len)
111#ifdef XML_UNICODE_WCHAR_T
112 String chars(_chars, _len);
115 String chars = decoder.decode(_chars, _len);
118 XmlDefaultHandler* pHandler = (XmlDefaultHandler*) _userData;
119 pHandler->characters(chars);
122void XmlDefaultHandler::startElement(
123 const String& _name,
const StringStringArray& _attrs
126 __DCL_TRACE2(
__T(
"startElement[%ls], attrs[%ls]\n"), _name.data(), _attrs.toString().data());
129void XmlDefaultHandler::endElement(
135void XmlDefaultHandler::characters(
146 __parser = XML_ParserCreate(
NULL);
151 XML_ParserFree(__parser);
158 XML_SetElementHandler(
160 XmlDefaultHandler::startElement,
161 XmlDefaultHandler::endElement
164 XML_SetCharacterDataHandler(
166 XmlDefaultHandler::characters
169 XML_SetUserData(__parser, &_handler);
171 XML_Status status = XML_Parse(
178 if (status == XML_STATUS_ERROR) {
210 r.append(
__T(
"<")).append(__name);
211 for (StringStringArray::ConstIterator it = __attrs.begin();
212 it != __attrs.end(); it++) {
213 r.append(
__T(
" ")).append((*it).key).append(
__T(
"=\""))
214 .append(String::escape((*it).value, (*it).value.length(), String::ESCAPE_XML))
218 if (__children.isEmpty()) {
224 .append(
__T(
"</")).append(__name).append(
__T(
">"));
231const String& _name,
const StringStringArray& _attrs
240 for (PointerArray::Iterator it = __children.begin();
241 it != __children.end(); it++) {
248 __children.add(_node);
255 for (PointerArray::ConstIterator it = __children.begin();
256 it != __children.end(); it++
274 for (PointerArray::ConstIterator it = __children.begin();
275 it != __children.end(); it++
280 r.append(String::escape(s, s.length(), String::ESCAPE_XML));
301 __currentElement =
NULL;
315void XmlDocument::startElement(
const String& _name,
const StringStringArray& _attrs)
319 __topElement = pElement;
323 __currentElement = pElement;
326void XmlDocument::endElement(
const String& _name)
328 __DCL_ASSERT(__currentElement !=
NULL && __currentElement->name() == _name);
330 XmlNode* pParentNode = __currentElement->parentNode();
332 if (__currentElement != __topElement) {
337 __currentElement = (XmlElement*) pParentNode;
340void XmlDocument::characters(
const String& _chars)
342 XmlCharsNode* charsNode =
new XmlCharsNode(__currentElement, _chars);
343 __currentElement->addChildNode(charsNode);
#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 *_parentNode, const String &_chars)
virtual String toString() const
void addChildNode(XmlNode *_node)
const String innerText() const
virtual String toString() const
const String innerXml() const
XmlElement(XmlNode *_parentNode, const String &_name, const StringStringArray &_attrs)
virtual String toString() const
XmlException(XML_Parser _parser)
XmlNode(XmlNode *_parentNode)
void parse(const ByteString &_data, XmlDefaultHandler &_handler) __DCL_THROWS1(XmlException *)