d473b386e593d047bb460dbe2d5efd7de4d87204
[scilab.git] / scilab / modules / xml / src / cpp / XMLDocument.hxx
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 #ifndef __XMLDOCUMENT_HXX__
14 #define __XMLDOCUMENT_HXX__
15
16 #include <cstdio>
17 #include <list>
18 #include <cstring>
19 #include <string>
20
21 #include "dynlib_xml_scilab.h"
22
23 extern "C"
24 {
25 #include "xml.h"
26 #ifndef XML_XPATH_CHECKNS
27 #define XML_XPATH_CHECKNS
28 #endif
29 }
30
31 #include "XMLObject.hxx"
32
33 namespace org_modules_xml
34 {
35 class XMLElement;
36 class XMLObject;
37 class XMLXPath;
38 class XMLValidation;
39
40 /**
41  * @file
42  * @author Calixte DENIZET <calixte.denizet@scilab.org>
43  *
44  * Class to wrap a xmlDoc
45  * @see http://xmlsoft.org/html/libxml-tree.html#xmlDoc
46  */
47 class XML_SCILAB_IMPEXP XMLDocument: public XMLObject
48 {
49     static std::list < XMLDocument * >&openDocs;
50     xmlDoc *document;
51
52 public:
53     /**
54      * Gets the list of open docs
55      * @return the list
56      */
57     static const std::list < XMLDocument * >&getOpenDocuments();
58
59     /**
60      * Closes all the open documents
61      */
62     static void closeAllDocuments();
63
64     /**
65      * Builds a document with a given path (can be an url)
66      * @param path the document path
67      * @param validate a boolean to indicate if the document must be validated in using a DTD
68      * @param error a pointer to a string which will receive the error message
69      */
70     XMLDocument(const char *path, bool validate, std::string * error, const char * encoding = 0);
71
72     /**
73      * Builds a document with a given code
74      * @param xmlCode the XML code
75      * @param validate a boolean to indicate if the document must be validated in using a DTD
76      * @param error a pointer to a string which will receive the error message
77      */
78     XMLDocument(const std::string & xmlCode, bool validate, std::string * error, const char * encoding = 0);
79
80     /**
81      * Builds a simple document
82      * @param uri the document uri
83      * @param version the xml version
84      */
85     XMLDocument(char *uri, char *version);
86
87     ~XMLDocument();
88
89     void *getRealXMLPointer() const;
90
91     /**
92      * @return the xmlDoc behind this XMLDocument
93      */
94     xmlDoc *getRealDocument() const
95     {
96         return document;
97     }
98
99     /**
100      * @return the document root
101      */
102     const XMLElement *getRoot() const;
103
104     /**
105      * @param value the root to set
106      */
107     void setRoot(const XMLElement & value) const;
108
109     /**
110      * Replaces the root element by the root of the xmlCode/
111      * @param xmlCode the XML code
112      * @param error a pointer to a string which will receive the error message
113      */
114     void setRoot(const std::string & xmlCode, std::string * error) const;
115
116     /**
117      * @return the document URL
118      */
119     const char *getDocumentURL() const;
120
121     /**
122      * @param value the document URL to set
123      */
124     void setDocumentURL(const std::string & value) const;
125
126     /**
127      * Makes an XPath query on the document
128      * @param query the XPath query
129      * @param namespaces an a matrix nx2 containing mapping between prefix and href
130      * @param length the number of namespaces
131      * @param the node from where start the query
132      * @param error a pointer to a string which will receive the error message
133      * @return a pointer on a XPath object
134      */
135     const XMLXPath *makeXPathQuery(const char *query, char **namespaces, int length, const XMLElement * e, std::string * error);
136
137     const XMLObject *getXMLObjectParent() const;
138     const std::string dump(bool indent) const;
139     const std::string toString() const;
140
141 private:
142     /**
143      * Error function for the XML parser
144      * @see http://xmlsoft.org/html/libxml-xmlerror.html#xmlGenericErrorFunc
145      */
146     static void errorFunction(void *ctx, const char *msg, ...);
147
148     /**
149      * Error function which does nothing for the XML parser
150      * @see http://xmlsoft.org/html/libxml-xmlerror.html#xmlGenericErrorFunc
151      */
152     static void errorFunctionWithoutOutput(void *ctx, const char *msg, ...)
153     {
154     }
155
156     /**
157      * Error function used when the XPath query is compiled/
158      * @see http://xmlsoft.org/html/libxml-xmlerror.html#xmlStructuredErrorFunc
159      */
160     static void errorXPathFunction(void *ctx, xmlError * error);
161
162     /**
163      * Reads and parses a document given in a file.
164      * @param filename the file name
165      * @param encoding the file encoding
166      * @param validate a boolean to indicate if the document must be validated in using a DTD
167      * @param error a string where to write the parsing errors
168      * @return a pointer on a xmlDoc
169      */
170     static xmlDoc *readDocument(const char *filename, const char * encoding, bool validate, std::string * error);
171
172     /**
173      * Read and parse a document given in a string.
174      * @param xmlCode the XML code
175      * @param validate a boolean to indicate if the document must be validated in using a DTD
176      * @param error a string where to write the parsing errors
177      * @return a pointer on a xmlDoc
178      */
179     static xmlDoc *readDocument(const std::string & xmlCode, const char * encoding, bool validate, std::string * error);
180
181     /**
182      * Initializes the context
183      * @param error a string where to write the parsing errors
184      * @param validate a boolean to indicate if the document must be validated in using a DTD
185      * @return a pointer on a context
186      */
187     static xmlParserCtxt *initContext(std::string * error, bool validate);
188
189     static std::string * errorBuffer;
190     static std::string * errorXPathBuffer;
191 };
192 }
193
194 #endif