30 #ifndef _RL_XML_NODE_H_
31 #define _RL_XML_NODE_H_
35 #include <boost/shared_array.hpp>
36 #include <libxml/parser.h>
37 #include <libxml/uri.h>
53 Node(const ::std::string& name) :
57 reinterpret_cast< const xmlChar* >(name.c_str())
65 if (NULL == this->
node->doc)
74 reinterpret_cast< const xmlChar* >(content.c_str())
80 return xmlAddChild(this->node,
node());
85 return xmlAddNextSibling(this->node,
node());
90 return xmlAddPrevSibling(this->node,
node());
95 return xmlAddSibling(this->node,
node());
103 reinterpret_cast< const xmlChar* >(name.c_str())
110 return xmlChildElementCount(this->
node);
115 ::boost::shared_array< xmlChar > content(
116 xmlNodeGetContent(this->
node),
120 return reinterpret_cast< char*
>(content.get());
125 ::boost::shared_array< xmlChar > absolute(
127 reinterpret_cast< const xmlChar* >(uri.c_str()),
128 xmlNodeGetBase(this->
node->doc, this->node)
133 ::boost::shared_array< char > unescaped(
134 xmlURIUnescapeString(
135 reinterpret_cast< char* >(absolute.get()),
144 if (0 == strncmp(unescaped.get(),
"file://localhost/", 17))
147 path = &unescaped.get()[17];
149 path = &unescaped.get()[16];
152 else if (0 == strncmp(unescaped.get(),
"file:///", 8))
155 path = &unescaped.get()[8];
157 path = &unescaped.get()[7];
162 path = unescaped.get();
170 return reinterpret_cast< const char*
>(this->
node->name);
175 ::boost::shared_array<xmlChar> relative(
177 reinterpret_cast< const xmlChar* >(uri.c_str()),
178 xmlNodeGetBase(this->
node->doc, this->node)
183 return reinterpret_cast< char*
>(relative.get());
186 ::std::string
getUri(const ::std::string& uri)
const
188 ::boost::shared_array< xmlChar > absolute(
190 reinterpret_cast< const xmlChar* >(uri.c_str()),
191 xmlNodeGetBase(this->
node->doc, this->node)
196 return reinterpret_cast< char*
>(absolute.get());
201 return NULL != xmlHasProp(
203 reinterpret_cast< const xmlChar* >(name.c_str())
209 return 1 == xmlNodeIsText(this->
node) ?
true :
false;
219 return xmlReplaceNode(this->node,
node());
226 reinterpret_cast< const xmlChar* >(content.c_str())
232 xmlNodeSetName(this->
node, reinterpret_cast< const xmlChar* >(name.c_str()));
237 int substitutions = xmlXIncludeProcessTreeFlags(this->
node, flags);
239 if (-1 == substitutions)
241 throw Exception(xmlGetLastError()->message);
244 return substitutions;
249 xmlUnlinkNode(this->
node);
260 #endif // _RL_XML_NODE_H_