Asterisk - The Open Source Telephony Project  21.4.1
Functions
xml.c File Reference

XML abstraction layer. More...

#include "asterisk.h"
#include "asterisk/xml.h"
#include "asterisk/logger.h"
#include "asterisk/utils.h"
#include "asterisk/autoconfig.h"
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xinclude.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
#include <libxslt/xsltInternals.h>
#include <libxslt/transform.h>
#include <libxslt/xsltutils.h>

Go to the source code of this file.

Functions

struct ast_xml_node * ast_xml_add_child (struct ast_xml_node *parent, struct ast_xml_node *child)
 Add a child node, to a specified parent node. More...
 
struct ast_xml_node * ast_xml_add_child_list (struct ast_xml_node *parent, struct ast_xml_node *child)
 Add a list of child nodes, to a specified parent node. More...
 
void ast_xml_close (struct ast_xml_doc *doc)
 Close an already open document and free the used structure. More...
 
struct ast_xml_node * ast_xml_copy_node_list (struct ast_xml_node *list)
 Create a copy of a n ode list. More...
 
int ast_xml_doc_dump_file (FILE *output, struct ast_xml_doc *doc)
 Dump the specified document to a file.
 
void ast_xml_doc_dump_memory (struct ast_xml_doc *doc, char **buffer, int *length)
 Dump the specified document to a buffer. More...
 
struct ast_xml_node * ast_xml_find_element (struct ast_xml_node *root_node, const char *name, const char *attrname, const char *attrvalue)
 Find a node element by name. More...
 
struct ast_xml_ns * ast_xml_find_namespace (struct ast_xml_doc *doc, struct ast_xml_node *node, const char *ns_name)
 
int ast_xml_finish (void)
 Cleanup library allocated global data. More...
 
void ast_xml_free_attr (const char *attribute)
 Free an attribute returned by ast_xml_get_attribute() More...
 
void ast_xml_free_node (struct ast_xml_node *node)
 Free node. More...
 
void ast_xml_free_text (const char *text)
 Free a content element that was returned by ast_xml_get_text() More...
 
const char * ast_xml_get_attribute (struct ast_xml_node *node, const char *attrname)
 Get a node attribute by name. More...
 
struct ast_xml_doc * ast_xml_get_doc (struct ast_xml_node *node)
 Get the document based on a node. More...
 
const char * ast_xml_get_ns_href (struct ast_xml_ns *ns)
 Get the href of a namespace. More...
 
const char * ast_xml_get_ns_prefix (struct ast_xml_ns *ns)
 Get the prefix of a namespace. More...
 
struct ast_xml_node * ast_xml_get_root (struct ast_xml_doc *doc)
 Get the document root node. More...
 
const char * ast_xml_get_text (struct ast_xml_node *node)
 Get an element content string. More...
 
int ast_xml_init (void)
 Initialize the XML library implementation. This function is used to setup everything needed to start working with the xml implementation. More...
 
struct ast_xml_doc * ast_xml_new (void)
 Create a XML document. More...
 
struct ast_xml_node * ast_xml_new_child (struct ast_xml_node *parent, const char *child_name)
 Add a child node inside a passed parent node. More...
 
struct ast_xml_node * ast_xml_new_node (const char *name)
 Create a XML node. More...
 
struct ast_xml_node * ast_xml_node_get_children (struct ast_xml_node *node)
 Get the node's children.
 
const char * ast_xml_node_get_name (struct ast_xml_node *node)
 Get the name of a node.
 
struct ast_xml_node * ast_xml_node_get_next (struct ast_xml_node *node)
 Get the next node in the same level.
 
struct ast_xml_node * ast_xml_node_get_parent (struct ast_xml_node *node)
 Get the parent of a specified node.
 
struct ast_xml_node * ast_xml_node_get_prev (struct ast_xml_node *node)
 Get the previous node in the same leve.
 
struct ast_xml_doc * ast_xml_open (char *filename)
 Open an XML document. More...
 
struct ast_xml_xpath_results * ast_xml_query (struct ast_xml_doc *doc, const char *xpath_str)
 Execute an XPath query on an XML document. More...
 
struct ast_xml_xpath_results * ast_xml_query_with_namespaces (struct ast_xml_doc *doc, const char *xpath_str, struct ast_xml_namespace_def_vector *namespaces)
 Execute an XPath query on an XML document with namespaces. More...
 
struct ast_xml_doc * ast_xml_read_memory (char *buffer, size_t size)
 Open an XML document that resides in memory. More...
 
int ast_xml_set_attribute (struct ast_xml_node *node, const char *name, const char *value)
 Set an attribute to a node. More...
 
void ast_xml_set_name (struct ast_xml_node *node, const char *name)
 Set or reset an element's name. More...
 
void ast_xml_set_root (struct ast_xml_doc *doc, struct ast_xml_node *node)
 Specify the root node of a XML document. More...
 
void ast_xml_set_text (struct ast_xml_node *node, const char *content)
 Set an element content string. More...
 
struct ast_xml_node * ast_xml_xpath_get_first_result (struct ast_xml_xpath_results *results)
 Return the first result node of an XPath query. More...
 
struct ast_xml_node * ast_xml_xpath_get_result (struct ast_xml_xpath_results *results, int i)
 Return a specific result node of an XPath query. More...
 
int ast_xml_xpath_num_results (struct ast_xml_xpath_results *results)
 Return the number of results from an XPath query. More...
 
void ast_xml_xpath_results_free (struct ast_xml_xpath_results *results)
 Free the XPath results. More...
 
struct ast_xml_doc * ast_xslt_apply (struct ast_xslt_doc *axslt, struct ast_xml_doc *axml, const char **params)
 Apply an XSLT stylesheet to an XML document. More...
 
void ast_xslt_close (struct ast_xslt_doc *axslt)
 Close a stylesheet document and free its resources. More...
 
struct ast_xslt_doc * ast_xslt_open (char *filename)
 Open an XSLT document. More...
 
struct ast_xslt_doc * ast_xslt_read_memory (char *buffer, size_t size)
 Open an XSLT document that resides in memory. More...
 
int ast_xslt_save_result_to_string (char **buffer, int *length, struct ast_xml_doc *result, struct ast_xslt_doc *axslt)
 Save the results of applying a stylesheet to a string. More...
 
static int process_xincludes (xmlDoc *doc)
 

Detailed Description

XML abstraction layer.

Author
Eliel C. Sardanons (LU1ALY) eliel.nosp@m.s@gm.nosp@m.ail.c.nosp@m.om

Definition in file xml.c.

Function Documentation

struct ast_xml_node* ast_xml_add_child ( struct ast_xml_node *  parent,
struct ast_xml_node *  child 
)

Add a child node, to a specified parent node.

Parameters
parentWhere to add the child node.
childThe child node to add.
Return values
NULLon error.
non-NULLThe add child node on success.

Definition at line 168 of file xml.c.

169 {
170  if (!parent || !child) {
171  return NULL;
172  }
173  return (struct ast_xml_node *) xmlAddChild((xmlNode *) parent, (xmlNode *) child);
174 }
struct ast_xml_node* ast_xml_add_child_list ( struct ast_xml_node *  parent,
struct ast_xml_node *  child 
)

Add a list of child nodes, to a specified parent node.

Parameters
parentWhere to add the child node.
childThe child list to add.
Return values
NULLon error.
non-NULLThe added child list on success.

Definition at line 176 of file xml.c.

177 {
178  if (!parent || !child) {
179  return NULL;
180  }
181  return (struct ast_xml_node *) xmlAddChildList((xmlNode *) parent, (xmlNode *) child);
182 }
void ast_xml_close ( struct ast_xml_doc *  doc)

Close an already open document and free the used structure.

Parameters
docXML Document to close

Definition at line 211 of file xml.c.

Referenced by xmldoc_purge_documentation().

212 {
213  if (!doc) {
214  return;
215  }
216 
217  xmlFreeDoc((xmlDoc *) doc);
218  doc = NULL;
219 }
struct ast_xml_node* ast_xml_copy_node_list ( struct ast_xml_node *  list)

Create a copy of a n ode list.

Parameters
listThe list to copy.
Return values
NULLon error.
non-NULLThe copied list.

Definition at line 184 of file xml.c.

185 {
186  if (!list) {
187  return NULL;
188  }
189  return (struct ast_xml_node *) xmlCopyNodeList((xmlNode *) list);
190 }
void ast_xml_doc_dump_memory ( struct ast_xml_doc *  doc,
char **  buffer,
int *  length 
)

Dump the specified document to a buffer.

Parameters
docThe XML doc to dump
bufferA pointer to a char * to receive the address of the results
lengthA pointer to an int to receive the length of the results
Note
The result buffer must be freed with ast_xml_free_text().

Definition at line 385 of file xml.c.

386 {
387  xmlDocDumpFormatMemory((xmlDocPtr)doc, (xmlChar **)buffer, length, 1);
388 }
struct ast_xml_node* ast_xml_find_element ( struct ast_xml_node *  root_node,
const char *  name,
const char *  attrname,
const char *  attrvalue 
)

Find a node element by name.

Parameters
root_nodeThis is the node starting point.
nameNode name to find.
attrnameattribute name to match (if NULL it won't be matched).
attrvalueattribute value to match (if NULL it won't be matched).
Return values
NULLif not found.
Returns
The node on success.

Definition at line 297 of file xml.c.

References ast_xml_free_attr(), ast_xml_get_attribute(), ast_xml_node_get_name(), and ast_xml_node_get_next().

Referenced by load_modules().

298 {
299  struct ast_xml_node *cur;
300  const char *attr;
301 
302  if (!root_node) {
303  return NULL;
304  }
305 
306  for (cur = root_node; cur; cur = ast_xml_node_get_next(cur)) {
307  /* Check if the name matchs */
308  if (strcmp(ast_xml_node_get_name(cur), name)) {
309  continue;
310  }
311  /* We need to check for a specific attribute name? */
312  if (!attrname || !attrvalue) {
313  return cur;
314  }
315  /* Get the attribute, we need to compare it. */
316  if ((attr = ast_xml_get_attribute(cur, attrname))) {
317  /* does attribute name/value matches? */
318  if (!strcmp(attr, attrvalue)) {
319  ast_xml_free_attr(attr);
320  return cur;
321  }
322  ast_xml_free_attr(attr);
323  }
324  }
325 
326  return NULL;
327 }
void ast_xml_free_attr(const char *attribute)
Free an attribute returned by ast_xml_get_attribute()
Definition: xml.c:253
const char * ast_xml_get_attribute(struct ast_xml_node *node, const char *attrname)
Get a node attribute by name.
Definition: xml.c:267
const char * ast_xml_node_get_name(struct ast_xml_node *node)
Get the name of a node.
Definition: xml.c:390
struct ast_xml_node * ast_xml_node_get_next(struct ast_xml_node *node)
Get the next node in the same level.
Definition: xml.c:400
int ast_xml_finish ( void  )

Cleanup library allocated global data.

Return values
0On success.
1On error.

Definition at line 57 of file xml.c.

Referenced by xmldoc_unload_documentation().

58 {
59  xmlCleanupParser();
60 #ifdef HAVE_LIBXSLT
61 #ifdef HAVE_LIBXSLT_CLEANUP
62  xsltCleanupGlobals();
63 #else
64  xsltUninit();
65 #endif
66 #endif
67 
68  return 0;
69 }
void ast_xml_free_attr ( const char *  attribute)

Free an attribute returned by ast_xml_get_attribute()

Parameters
attributepointer to be freed.

Definition at line 253 of file xml.c.

Referenced by ast_xml_find_element(), ast_xmldoc_build_documentation(), and ast_xmldoc_regenerate_doc_item().

254 {
255  if (attribute) {
256  xmlFree((char *) attribute);
257  }
258 }
void ast_xml_free_node ( struct ast_xml_node *  node)

Free node.

Parameters
nodeNode to be released.

Definition at line 243 of file xml.c.

244 {
245  if (!node) {
246  return;
247  }
248 
249  xmlFreeNode((xmlNode *) node);
250  node = NULL;
251 }
Definition: test_heap.c:38
void ast_xml_free_text ( const char *  text)

Free a content element that was returned by ast_xml_get_text()

Parameters
texttext to be freed.

Definition at line 260 of file xml.c.

261 {
262  if (text) {
263  xmlFree((char *) text);
264  }
265 }
const char* ast_xml_get_attribute ( struct ast_xml_node *  node,
const char *  attrname 
)

Get a node attribute by name.

Parameters
nodeNode where to search the attribute.
attrnameAttribute name.
Return values
NULLon error
Returns
The attribute value on success.
Note
The result must be freed with ast_xml_free_attr().

Definition at line 267 of file xml.c.

Referenced by ast_xml_find_element(), ast_xmldoc_build_documentation(), and ast_xmldoc_regenerate_doc_item().

268 {
269  xmlChar *attrvalue;
270 
271  if (!node) {
272  return NULL;
273  }
274 
275  if (!attrname) {
276  return NULL;
277  }
278 
279  attrvalue = xmlGetProp((xmlNode *) node, (xmlChar *) attrname);
280 
281  return (const char *) attrvalue;
282 }
Definition: test_heap.c:38
struct ast_xml_doc* ast_xml_get_doc ( struct ast_xml_node *  node)

Get the document based on a node.

Parameters
nodeA node that is part of the dom.
Returns
The dom pointer where this node resides.

Definition at line 329 of file xml.c.

330 {
331  if (!node) {
332  return NULL;
333  }
334 
335  return (struct ast_xml_doc *) ((xmlNode *)node)->doc;
336 }
Definition: test_heap.c:38
const char* ast_xml_get_ns_href ( struct ast_xml_ns *  ns)

Get the href of a namespace.

Parameters
nsThe namespace
Returns
The href of the namespace.

Definition at line 348 of file xml.c.

349 {
350  return (const char *) ((xmlNsPtr) ns)->href;
351 }
const char* ast_xml_get_ns_prefix ( struct ast_xml_ns *  ns)

Get the prefix of a namespace.

Parameters
nsThe namespace
Returns
The prefix of the namespace.

Definition at line 343 of file xml.c.

344 {
345  return (const char *) ((xmlNsPtr) ns)->prefix;
346 }
struct ast_xml_node* ast_xml_get_root ( struct ast_xml_doc *  doc)

Get the document root node.

Parameters
docXML Document reference
Return values
NULLon error
Returns
The root node on success.

Definition at line 230 of file xml.c.

Referenced by ast_xmldoc_build_documentation().

231 {
232  xmlNode *root_node;
233 
234  if (!doc) {
235  return NULL;
236  }
237 
238  root_node = xmlDocGetRootElement((xmlDoc *) doc);
239 
240  return (struct ast_xml_node *) root_node;
241 }
const char* ast_xml_get_text ( struct ast_xml_node *  node)

Get an element content string.

Parameters
nodeNode from where to get the string.
Return values
NULLon error.
Returns
The text content of node.

Definition at line 353 of file xml.c.

Referenced by load_modules().

354 {
355  if (!node) {
356  return NULL;
357  }
358 
359  return (const char *) xmlNodeGetContent((xmlNode *) node);
360 }
Definition: test_heap.c:38
int ast_xml_init ( void  )

Initialize the XML library implementation. This function is used to setup everything needed to start working with the xml implementation.

Return values
0On success.
1On error.

Definition at line 48 of file xml.c.

49 {
50  LIBXML_TEST_VERSION
51 #ifdef HAVE_LIBXSLT
52  xsltInit();
53 #endif
54  return 0;
55 }
struct ast_xml_doc* ast_xml_new ( void  )

Create a XML document.

Return values
NULLon error.
non-NULLThe allocated document structure.

Definition at line 136 of file xml.c.

137 {
138  xmlDoc *doc;
139 
140  doc = xmlNewDoc((const xmlChar *) "1.0");
141  return (struct ast_xml_doc *) doc;
142 }
struct ast_xml_node* ast_xml_new_child ( struct ast_xml_node *  parent,
const char *  child_name 
)

Add a child node inside a passed parent node.

Parameters
parentThe pointer of the parent node.
child_nameThe name of the child node to add.
Return values
NULLon error.
non-NULLThe created child node pointer.

Definition at line 156 of file xml.c.

157 {
158  xmlNode *child;
159 
160  if (!parent || !child_name) {
161  return NULL;
162  }
163 
164  child = xmlNewChild((xmlNode *) parent, NULL, (const xmlChar *) child_name, NULL);
165  return (struct ast_xml_node *) child;
166 }
struct ast_xml_node* ast_xml_new_node ( const char *  name)

Create a XML node.

Parameters
nameThe name of the node to be created.
Return values
NULLon error.
non-NULLThe allocated node structe.

Definition at line 144 of file xml.c.

145 {
146  xmlNode *node;
147  if (!name) {
148  return NULL;
149  }
150 
151  node = xmlNewNode(NULL, (const xmlChar *) name);
152 
153  return (struct ast_xml_node *) node;
154 }
Definition: test_heap.c:38
struct ast_xml_doc* ast_xml_open ( char *  filename)

Open an XML document.

Parameters
filenameDocument path.
Return values
NULLon error.
Returns
The ast_xml_doc reference to the open document.

Definition at line 94 of file xml.c.

95 {
96  xmlDoc *doc;
97 
98  if (!filename) {
99  return NULL;
100  }
101 
102  doc = xmlReadFile(filename, NULL, XML_PARSE_RECOVER | XML_PARSE_NOENT);
103  if (!doc) {
104  return NULL;
105  }
106 
107  /* process xinclude elements. */
108  if (process_xincludes(doc) < 0) {
109  xmlFreeDoc(doc);
110  return NULL;
111  }
112 
113 #ifdef HAVE_LIBXSLT
114  {
115  xsltStylesheetPtr xslt = xsltLoadStylesheetPI(doc);
116  if (xslt) {
117  xmlDocPtr tmpdoc = xsltApplyStylesheet(xslt, doc, NULL);
118  xsltFreeStylesheet(xslt);
119  xmlFreeDoc(doc);
120  if (!tmpdoc) {
121  return NULL;
122  }
123  doc = tmpdoc;
124  }
125  }
126 #else /* no HAVE_LIBXSLT */
127  ast_log(LOG_NOTICE, "XSLT support not found. XML documentation may be incomplete.\n");
128 #endif /* HAVE_LIBXSLT */
129 
130  /* Optimize for XPath */
131  xmlXPathOrderDocElems(doc);
132 
133  return (struct ast_xml_doc *) doc;
134 }
struct ast_xml_xpath_results* ast_xml_query ( struct ast_xml_doc *  doc,
const char *  xpath_str 
)

Execute an XPath query on an XML document.

Parameters
docXML document to query
xpath_strThe XPath query string to execute on the document
Returns
An object containing the results of the XPath query on success
Return values
NULLon failure
Since
12

Definition at line 441 of file xml.c.

References ast_debug.

Referenced by ast_xmldoc_query().

442 {
443  xmlXPathContextPtr context;
444  xmlXPathObjectPtr result;
445  if (!(context = xmlXPathNewContext((xmlDoc *) doc))) {
446  ast_log(LOG_ERROR, "Could not create XPath context!\n");
447  return NULL;
448  }
449  result = xmlXPathEvalExpression((xmlChar *) xpath_str, context);
450  xmlXPathFreeContext(context);
451  if (!result) {
452  ast_log(LOG_WARNING, "Error for query: %s\n", xpath_str);
453  return NULL;
454  }
455  if (xmlXPathNodeSetIsEmpty(result->nodesetval)) {
456  xmlXPathFreeObject(result);
457  ast_debug(5, "No results for query: %s\n", xpath_str);
458  return NULL;
459  }
460  return (struct ast_xml_xpath_results *) result;
461 }
#define ast_debug(level,...)
Log a DEBUG message.
struct ast_xml_xpath_results* ast_xml_query_with_namespaces ( struct ast_xml_doc *  doc,
const char *  xpath_str,
struct ast_xml_namespace_def_vector namespaces 
)

Execute an XPath query on an XML document with namespaces.

Parameters
docXML document to query
xpath_strThe XPath query string to execute on the document
namespacesA vector of ast_xml_namespace structures (not pointers)
Returns
An object containing the results of the XPath query on success
Return values
NULLon failure

Definition at line 463 of file xml.c.

References ast_debug, AST_VECTOR_GET, and AST_VECTOR_SIZE.

465 {
466  xmlXPathContextPtr context;
467  xmlXPathObjectPtr result;
468  int i;
469 
470  if (!(context = xmlXPathNewContext((xmlDoc *) doc))) {
471  ast_log(LOG_ERROR, "Could not create XPath context!\n");
472  return NULL;
473  }
474 
475  for (i = 0; i < AST_VECTOR_SIZE(namespaces); i++) {
476  struct ast_xml_namespace_def ns = AST_VECTOR_GET(namespaces, i);
477  if (xmlXPathRegisterNs(context, (xmlChar *)ns.prefix,
478  (xmlChar *)ns.href) != 0) {
479  xmlXPathFreeContext(context);
480  ast_log(LOG_ERROR, "Could not register namespace %s:%s\n",
481  ns.prefix, ns.href);
482  return NULL;
483  }
484  }
485 
486  result = xmlXPathEvalExpression((xmlChar *) xpath_str, context);
487  xmlXPathFreeContext(context);
488  if (!result) {
489  ast_log(LOG_WARNING, "Error for query: %s\n", xpath_str);
490  return NULL;
491  }
492  if (xmlXPathNodeSetIsEmpty(result->nodesetval)) {
493  xmlXPathFreeObject(result);
494  ast_debug(5, "No results for query: %s\n", xpath_str);
495  return NULL;
496  }
497  return (struct ast_xml_xpath_results *) result;
498 }
#define ast_debug(level,...)
Log a DEBUG message.
Namespace definition.
Definition: xml.h:325
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:680
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:609
struct ast_xml_doc* ast_xml_read_memory ( char *  buffer,
size_t  size 
)

Open an XML document that resides in memory.

Parameters
bufferThe address where the document is stored
sizeThe number of bytes in the document
Return values
NULLon error.
Returns
The ast_xml_doc reference to the open document.

Definition at line 192 of file xml.c.

193 {
194  xmlDoc *doc;
195 
196  if (!buffer) {
197  return NULL;
198  }
199 
200  if (!(doc = xmlParseMemory(buffer, (int) size))) {
201  /* process xinclude elements. */
202  if (process_xincludes(doc) < 0) {
203  xmlFreeDoc(doc);
204  return NULL;
205  }
206  }
207 
208  return (struct ast_xml_doc *) doc;
209 }
int ast_xml_set_attribute ( struct ast_xml_node *  node,
const char *  name,
const char *  value 
)

Set an attribute to a node.

Parameters
nodeIn which node we want to insert the attribute.
nameThe attribute name.
valueThe attribute value.
Return values
0on success.
-1on error.

Definition at line 284 of file xml.c.

285 {
286  if (!name || !value) {
287  return -1;
288  }
289 
290  if (!xmlSetProp((xmlNode *) node, (xmlChar *) name, (xmlChar *) value)) {
291  return -1;
292  }
293 
294  return 0;
295 }
Definition: test_heap.c:38
void ast_xml_set_name ( struct ast_xml_node *  node,
const char *  name 
)

Set or reset an element's name.

Parameters
nodeNode whose name is to be set.
nameNew name.

Definition at line 371 of file xml.c.

372 {
373  if (!node || !name) {
374  return;
375  }
376 
377  xmlNodeSetName((xmlNode *) node, (const xmlChar *) name);
378 }
Definition: test_heap.c:38
void ast_xml_set_root ( struct ast_xml_doc *  doc,
struct ast_xml_node *  node 
)

Specify the root node of a XML document.

Parameters
docXML Document reference
nodeA pointer to the node we want to set as root node.

Definition at line 221 of file xml.c.

222 {
223  if (!doc || !node) {
224  return;
225  }
226 
227  xmlDocSetRootElement((xmlDoc *) doc, (xmlNode *) node);
228 }
Definition: test_heap.c:38
void ast_xml_set_text ( struct ast_xml_node *  node,
const char *  content 
)

Set an element content string.

Parameters
nodeNode from where to set the content string.
contentThe text to insert in the node.

Definition at line 362 of file xml.c.

363 {
364  if (!node || !content) {
365  return;
366  }
367 
368  xmlNodeSetContent((xmlNode *) node, (const xmlChar *) content);
369 }
Definition: test_heap.c:38
struct ast_xml_node* ast_xml_xpath_get_first_result ( struct ast_xml_xpath_results *  results)

Return the first result node of an XPath query.

Parameters
resultsThe XPath results object to get the first result from
Returns
The first result in the XPath object on success
Return values
NULLon error
Since
12

Definition at line 415 of file xml.c.

Referenced by load_modules().

416 {
417  return (struct ast_xml_node *) ((xmlXPathObjectPtr) results)->nodesetval->nodeTab[0];
418 }
struct ast_xml_node* ast_xml_xpath_get_result ( struct ast_xml_xpath_results *  results,
int  n 
)

Return a specific result node of an XPath query.

Parameters
resultsThe XPath results object to get the result from
nThe index of the result to get
Returns
The nth result in the XPath object on success
Return values
NULLon error

Definition at line 420 of file xml.c.

421 {
422  return (struct ast_xml_node *) ((xmlXPathObjectPtr) results)->nodesetval->nodeTab[i];
423 }
int ast_xml_xpath_num_results ( struct ast_xml_xpath_results *  results)

Return the number of results from an XPath query.

Parameters
resultsThe XPath results object to count
Returns
The number of results in the XPath object
Since
12

Definition at line 433 of file xml.c.

434 {
435  if (!results) {
436  return 0;
437  }
438  return ((xmlXPathObjectPtr) results)->nodesetval->nodeNr;
439 }
void ast_xml_xpath_results_free ( struct ast_xml_xpath_results *  results)

Free the XPath results.

Parameters
resultsThe XPath results object to dispose of
Since
12

Definition at line 425 of file xml.c.

Referenced by load_modules().

426 {
427  if (!results) {
428  return;
429  }
430  xmlXPathFreeObject((xmlXPathObjectPtr) results);
431 }
struct ast_xml_doc* ast_xslt_apply ( struct ast_xslt_doc *  xslt,
struct ast_xml_doc *  doc,
const char **  params 
)

Apply an XSLT stylesheet to an XML document.

Parameters
xsltXSLT stylesheet to apply.
docXML document the stylesheet will be applied to.
paramsAn array of name value pairs to pass as parameters The array must terminate with a NULL sentinel. Example: { "name1", "value1", "name2", "value2", NULL }
Returns
A pointer to the result document which must be freed with ast_xml_close()

Definition at line 561 of file xml.c.

562 {
563  xsltStylesheet *xslt = (xsltStylesheet *)axslt;
564  xmlDoc *xml = (xmlDoc *)axml;
565  xmlDoc *res;
566  xsltTransformContextPtr ctxt;
567  xmlNs *ns;
568  int options = XSLT_PARSE_OPTIONS;
569 
570  /*
571  * Normally we could just call xsltApplyStylesheet() without creating
572  * our own transform context but passing parameters to it that have
573  * namespace prefixes isn't supported. Instead we have to create a
574  * transform context, iterate over the namespace declarations in the
575  * stylesheet (not the incoming xml document), add them to the
576  * transform context's xpath context, and call xsltApplyStylesheetUser.
577  *
578  * Since this is a bit involved and libxslt apparently doesn't completely
579  * clean up after itself in this situation, we'll only do that dance
580  * if there are parameters passed in. Otherwise we just call the simpler
581  * xsltApplyStylesheet.
582  *
583  */
584 
585  if (!params) {
586  res = xsltApplyStylesheet(xslt, xml, params);
587  return (struct ast_xml_doc *)res;
588  }
589 
590  ctxt = xsltNewTransformContext(xslt, xml);
591  xsltSetCtxtParseOptions(ctxt, options);
592 
593  for (ns = xslt->doc->children->nsDef; ns; ns = ns->next) {
594  if (xmlXPathRegisterNs(ctxt->xpathCtxt, ns->prefix, ns->href) != 0) {
595  xsltFreeTransformContext(ctxt);
596  return NULL;
597  }
598  }
599 
600  res = xsltApplyStylesheetUser(xslt, xml, params, NULL, NULL, ctxt);
601  xmlXPathFreeContext(ctxt->xpathCtxt);
602  ctxt->xpathCtxt = NULL;
603  xsltFreeTransformContext(ctxt);
604 
605  return (struct ast_xml_doc *)res;
606 }
void ast_xslt_close ( struct ast_xslt_doc *  xslt)

Close a stylesheet document and free its resources.

Parameters
xsltXSLT stylesheet to close

Definition at line 552 of file xml.c.

553 {
554  if (!axslt) {
555  return;
556  }
557 
558  xsltFreeStylesheet((xsltStylesheet *) axslt);
559 }
struct ast_xslt_doc* ast_xslt_open ( char *  filename)

Open an XSLT document.

Parameters
filenamestylesheet path.
Returns
The stylesheet document. Must be closed with ast_xslt_close().

Definition at line 501 of file xml.c.

502 {
503  xsltStylesheet *xslt;
504  xmlDoc *xml;
505 
506  xml = xmlReadFile(filename, NULL, XML_PARSE_RECOVER | XML_PARSE_NOENT);
507  if (!xml) {
508  return NULL;
509  }
510 
511  if (process_xincludes(xml) < 0) {
512  xmlFreeDoc(xml);
513  return NULL;
514  }
515  xmlXPathOrderDocElems(xml);
516 
517  if (!(xslt = xsltParseStylesheetDoc(xml))) {
518  xmlFreeDoc(xml);
519  return NULL;
520  }
521 
522  return (struct ast_xslt_doc *) xslt;
523 }
struct ast_xslt_doc* ast_xslt_read_memory ( char *  buffer,
size_t  size 
)

Open an XSLT document that resides in memory.

Parameters
bufferThe address where the stylesheet is stored
sizeThe number of bytes in the stylesheet
Returns
The stylesheet document. Must be closed with ast_xslt_close().

Definition at line 525 of file xml.c.

526 {
527  xsltStylesheet *xslt;
528  xmlDoc *doc;
529 
530  if (!buffer) {
531  return NULL;
532  }
533 
534  doc = xmlReadMemory(buffer, (int) size, NULL, NULL, XML_PARSE_RECOVER | XML_PARSE_NOENT);
535  if (!doc) {
536  return NULL;
537  }
538 
539  if (process_xincludes(doc) < 0) {
540  xmlFreeDoc(doc);
541  return NULL;
542  }
543 
544  if (!(xslt = xsltParseStylesheetDoc(doc))) {
545  xmlFreeDoc(doc);
546  return NULL;
547  }
548 
549  return (struct ast_xslt_doc *) xslt;
550 }
int ast_xslt_save_result_to_string ( char **  buffer,
int *  length,
struct ast_xml_doc *  result,
struct ast_xslt_doc *  xslt 
)

Save the results of applying a stylesheet to a string.

Parameters
[out]bufferA pointer to a char * to receive the address of the result string. The buffer must be freed with ast_xml_free_text().
[out]lengthA pointer to an int to receive the result string length.
resultThe result document from ast_xslt_apply.
xsltThe stylesheet that was applied.
Returns
0 on success, any other value on failure.

Definition at line 608 of file xml.c.

610 {
611  return xsltSaveResultToString((xmlChar **)buffer, length, (xmlDoc *)result, (xsltStylesheet *)axslt);
612 }