Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
XmlNode.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* XmlNode.h (C) 2000-2023 */
9/* */
10/* Noeud quelconque d'un arbre DOM. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_XMLNODE_H
13#define ARCANE_CORE_XMLNODE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/String.h"
18#include "arcane/core/Dom.h"
19
20#include <iterator>
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31class IRessourceMng;
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36class XmlNodeIterator;
37class XmlNodeConstIterator;
38class XmlNodeList;
39
40/*!
41 * \ingroup Xml
42 * \brief Noeud d'un arbre DOM.
43 *
44 * Cette classe sert pour tous les types de noeuds du DOM et permet
45 * de les manipuler de manière plus simple qu'avec le DOM sans avoir
46 * besoin de faire des conversions de types.
47 *
48 * Chaque noeud peut être considéré comme un container au sens de la STL.
49 */
50class ARCANE_CORE_EXPORT XmlNode
51{
52 public:
53
54 //! Type des éléments du tableau
56 //! Type de l'itérateur sur un élément du tableau
58 //! Type de l'itérateur constant sur un élément du tableau
60 //! Type pointeur d'un élément du tableau
62 //! Type pointeur constant d'un élément du tableau
63 typedef const value_type* const_pointer;
64 //! Type référence d'un élément du tableau
66 //! Type référence constante d'un élément du tableau
68 //! Type indexant le tableau
69 typedef Integer size_type;
70 //! Type d'une distance entre itérateur éléments du tableau
71 typedef int difference_type;
72
73 //! Type d'un itérateur sur tout le tableau
75 //! Type d'un itérateur constant sur tout le tableau
77
78 public:
79
80 /*! \brief NodeType
81 An integer indicating which type of node this is.
82 \note Numeric codes up to 200 are reserved to W3C for possible future use.
83 */
84 enum eType
85 {
86 //! The node is an Element
87 ELEMENT = 1,
88 //! The node is an Attr
89 ATTRIBUTE = 2,
90 //! The node is a Text node
91 TEXT = 3,
92 //! The node is a CDATASection
93 CDATA_SECTION = 4,
94 //! The node is an EntityReference
95 ENTITY_REFERENCE = 5,
96 //! The node is an Entity
97 ENTITY = 6,
98 //! The node is a ProcessingInstruction
99 PROCESSING_INSTRUCTION = 7,
100 //! The node is a Comment
101 COMMENT = 8,
102 //! The node is a Document
103 DOCUMENT = 9,
104 //! The node is a DocumentType
105 DOCUMENT_TYPE = 10,
106 //! The node is a DocumentFragment
107 DOCUMENT_FRAGMENT = 11,
108 //! The node is a Notation
109 NOTATION = 12
110 };
111
112 public:
113
114 XmlNode(IRessourceMng* m,const dom::Node& node) : m_rm(m), m_node(node) {}
115 //TODO: à supprimer
116 explicit XmlNode(IRessourceMng* m) : m_rm(m), m_node() {}
117 XmlNode() : m_rm(nullptr), m_node() {}
118
119 public:
120
121 //! Retourne un iterateur sur le premier élément du tableau
122 inline iterator begin();
123 //! Retourne un iterateur sur le premier élément après la fin du tableau
124 inline iterator end();
125 //! Retourne un iterateur constant sur le premier élément du tableau
126 inline const_iterator begin() const;
127 //! Retourne un iterateur constant sur le premier élément après la fin du tableau
128 inline const_iterator end() const;
129
130 public:
131
132 //! Type du noeud
133 eType type() const;
134
135 //! Nom du noeud
136 String name() const;
137
138 /*! \brief Nom XPath du noeud avec ces ancêtres.
139 * \warning Ne fonctionne que pour les éléments.
140 */
141 String xpathFullName() const;
142
143 //! Vrai si le nom de l'élément est \a name
144 bool isNamed(const String& name) const;
145
146 /*! \brief Valeur du noeud.
147 *
148 * Pour un élément, il s'agit de la concaténation des valeurs de chacun
149 * de ses noeuds fils de type TEXT, CDATA_SECTION ou ENTITY_REFERENCE.
150 * Pour les noeuds autre que les éléments, il s'agit de la valeur de
151 * la méthode Node::nodeValue() du DOM.
152 */
153 String value() const;
154
155 /*! \brief Valeur du noeud convertie en entier.
156 *
157 * Si la conversion échoue, si \a throw_exception
158 * vaut \a false retourne 0, sinon lève une exception.
159 */
160 Integer valueAsInteger(bool throw_exception=false) const;
161
162 /*! \brief Valeur du noeud convertie en entier 64 bits. 0 si conversion échoue.
163 *
164 * Si la conversion échoue, si \a throw_exception
165 * vaut \a false retourne 0, sinon lève une exception.
166 */
167 Int64 valueAsInt64(bool throw_exception=false) const;
168
169 /*! \brief Valeur du noeud convertie en booléan.
170 *
171 * Une valeur de \c false ou \c 0 correspond à \a false. Une valeur
172 * de \c true ou \c 1 correspond à \a true.
173 * Si la conversion échoue, si \a throw_exception
174 * vaut \a false retourne \a false, sinon lève une exception.
175 */
176 bool valueAsBoolean(bool throw_exception=false) const;
177
178 /*! \brief Valeur du noeud convertie en réel.
179 * Si la conversion échoue, si \a throw_exception
180 * vaut \a false retourne 0.0, sinon lève une exception.
181 */
182 Real valueAsReal(bool throw_exception=false) const;
183
184 /*! \brief Positionne la valeur du noeud.
185 *
186 * Cette méthode n'est valide que pour les noeuds ELEMENT_NODE ou
187 * ATTRIBUTE_NODE. Pour les éléments, elles supprime tous les fils
188 * et ajoute un seul fils de type TEXT_NODE comportant la valeur \a value
189 */
190 void setValue(const String& value);
191
192 /*! \brief Valeur de l'attribut \a name.
193 *
194 * Si l'attribut n'existe pas, si \a throw_exception vaut \a false retourne
195 * la chaîne nulle, sinon lève une exception.
196 */
197 String attrValue(const String& name,bool throw_exception=false) const;
198
199 //! Positionne l'attribut \a name à la valeur \a value
200 void setAttrValue(const String& name,const String& value);
201
202 /*!
203 * \brief Retourne l'attribut de nom \a name.
204 *
205 * Si l'attribut n'existe pas, si \a throw_exception vaut \a false retourne
206 * un noeud nul, sinon lève une exception.
207 */
208 XmlNode attr(const String& name,bool throw_exception=false) const;
209
210 /*!
211 * \brief Retourne l'attribut de nom \a name.
212 * Si aucun attribut avec ce nom n'existe, un attribut avec comme
213 * valeur la chaîne nul est créé et retourné.
214 */
215 XmlNode forceAttr(const String& name);
216
217 /*!
218 * \brief Supprime l'attribut de nom \a name de ce noeud.
219 * Si ce noeud n'est pas élément, rien n'est effectué.
220 */
221 void removeAttr(const String& name) const;
222
223 /*!
224 * \brief Retourne le noeud élément du document.
225 * \pre type()==DOCUMENT_NODE
226 */
227 XmlNode documentElement() const;
228
229 /*!
230 * \brief Retourne l'élément propriétaire de cet attribut.
231 * \pre type()==ATTRIBUTE_NODE
232 */
233 XmlNode ownerElement() const;
234
235 //! Supprime tous les noeuds fils
236 void clear();
237
238 /*!
239 * \brief Noeud fils de celui-ci de nom \a name
240 *
241 * Si plusieurs noeuds portant ce nom existent, retourne le premier.
242 * Si le noeud n'est pas trouvé, retourne un noeud nul
243 */
244 XmlNode child(const String& name) const;
245
246 /*!
247 * \brief Noeud fils de celui-ci de nom \a name
248 *
249 * Si plusieurs noeuds portant ce nom existent, retourne le premier.
250 * Si le noeud n'est pas trouvé, lève une exception.
251 */
252 XmlNode expectedChild(const String& name) const;
253
254 //! Ensemble des noeuds fils de ce noeud ayant pour nom \a name
255 XmlNodeList children(const String& name) const;
256
257 //! Ensemble des noeuds fils de ce noeud
258 XmlNodeList children() const;
259
260 //! Parent de ce noeud (null si aucun)
261 XmlNode parent() const { return XmlNode(m_rm,m_node.parentNode()); }
262
263 /*! \brief Ajoute \a child_node comme fils de ce noeud.
264 *
265 * Le noeud est ajouté après tous les fils.
266 */
267 void append(const XmlNode& child_node) { m_node.appendChild(child_node.domNode()); }
268 //! Supprime le noeud fils \a child_node
269 void remove(const XmlNode& child_node);
270 //! Remplace le noeud fils \a ref_node par le noeud \a new_node
271 void replace(const XmlNode& new_node,XmlNode& ref_node);
272 //! Supprime ce noeud du document
273 void remove();
274 //! Premier fils
275 XmlNode front() const { return XmlNode(m_rm,m_node.firstChild()); }
276 //! Dernier fils
277 XmlNode last() const { return XmlNode(m_rm,m_node.lastChild()); }
278 //! Noeud suivant (nextSibling())
279 XmlNode next() const { return XmlNode(m_rm,m_node.nextSibling()); }
280 //! Noeud précédent (previousSibling())
281 XmlNode prev() const { return XmlNode(m_rm,m_node.previousSibling()); }
282 //! Retourne le noeud suivant ce noeud ayant le nom \a name.
283 XmlNode nextWithName(const String& name) const;
284 //! Retourne le noeud précédent ce noeud ayant le nom \a name.
285 XmlNode prevWithName(const String& name) const;
286 //! Retourne le noeud suivant ce noeud ayant le même type.
287 XmlNode nextSameType() const;
288 //! Retourne le noeud précédent ce noeud ayant le même type.
289 XmlNode prevSameType() const;
290 void operator++() { m_node = m_node.nextSibling(); }
291 void operator--() { m_node = m_node.previousSibling(); }
292
293 //! Vrai si le noeud est nul
294 bool null() const { return m_node._null(); }
295 bool operator!() const { return null(); }
296
297 //! \internal
298 dom::Node domNode() const { return m_node; }
299 //! \internal
300 void assignDomNode(const dom::Node& node);
301
302 /*!
303 * \brief Insère un noeud.
304 * Insère le noeud \a new_child après le noeud \a ref_node.
305 * Si \a new_child est \c nul, ne fait rien.
306 * Si \a ref_node est \c nul, \a new_child est ajouté à la fin (comme append()). Sinon,
307 * \a ref_node doit être fils de ce noeud et \a new_child est inséré après
308 * \a ref_node.
309 * En cas de succès, retourne le noeud ajouté (\a new_child), sinon le noeud nul.
310 */
311 XmlNode insertAfter(const XmlNode& new_child,const XmlNode& ref_node);
312
313 /*!
314 * \brief Retourne le fils de ce noeud ayant pour nom \a elem_name et
315 * un attribut de nom \a attr_name avec pour valeur \a attr_value.
316 */
317 XmlNode childWithAttr(const String& elem_name,const String& attr_name,
318 const String& attr_value) const;
319 /*!
320 * \brief Retourne le fils de ce noeud ayant pour nom \a elem_name et
321 * un attribut de nom \c "name" avec pour valeur \a attr_value.
322 */
323 XmlNode childWithNameAttr(const String& elem_name,
324 const String& attr_value) const;
325
326 /*!
327 * \brief Retourne un noeud à partir d'une expression XPath.
328 * \param xpath_expr Expression XPath.
329 */
330 XmlNode xpathNode(const String& xpath_expr) const;
331
332 /*!
333 * \brief Créé un noeud d'un type donné.
334 *
335 * Si type() ne vaut pas DOCUMENT_NODE, utilise ownerDocument() comme
336 * fabrique.
337 *
338 * \param type type du noeud.
339 * \param nom du noeud.
340 * \param valeur du noeud.
341 * \return le noeud créé.
342 * \pre type()==DOCUMENT_NODE
343 */
344 XmlNode createNode(eType type,const String& name,const String& value);
345
346 /*!
347 * \brief Créé un noeud d'un type donné.
348 *
349 * Si type() ne vaut pas DOCUMENT_NODE, utilise ownerDocument() comme
350 * fabrique.
351 *
352 * \param type type du noeud.
353 * \param nom ou valeur du noeud dans le cas ou le noeud n'a pas de nom.
354 * \return le noeud créé.
355 */
356 XmlNode createNode(eType type,const String& name_or_value);
357
358 /*!
359 * \brief Créé un noeud texte.
360 * \param value valeur du noeud texte.
361 * \return le noeud créé.
362 */
363 XmlNode createText(const String& value);
364
365 XmlNode createElement(const String& name);
366
367 XmlNode createAndAppendElement(const String& name);
368
369 XmlNode createAndAppendElement(const String& name,const String& value);
370
371 XmlNode ownerDocument() const { return XmlNode(m_rm,m_node.ownerDocument()); }
372
373 IRessourceMng* rm() const { return m_rm; }
374
375 private:
376
377 IRessourceMng* m_rm;
378 dom::Node m_node;
379
380 protected:
381
382 String _value() const;
383 XmlNode _build(const dom::Node& node) const;
384 XmlNode _nullNode() const;
385 void _setNode(const dom::Node& n) { m_node = n; }
386 inline void _throwBadConvert(const char* type_name,const String& value) const;
387};
388
389/*---------------------------------------------------------------------------*/
390/*---------------------------------------------------------------------------*/
391/*!
392 * \brief Elément d'un arbre DOM.
393 */
394class ARCANE_CORE_EXPORT XmlElement
395: public XmlNode
396{
397 public:
398 /*! \brief Créé un élément fils de \a parent.
399 * L'élément créé a pour nom \a name et pour valeur \a value.
400 * Il est ajouté à la fin de la liste des fils de \a parent.
401 */
402 XmlElement(XmlNode& parent,const String& name,const String& value);
403 /*! \brief Créé un élément fils de \a parent.
404 * L'élément créé a pour nom \a name et pour valeur \a value.
405 * Il est ajouté à la fin de la liste des fils de \a parent.
406 */
407 XmlElement(XmlNode& parent,const String& name);
408};
409
410/*---------------------------------------------------------------------------*/
411/*---------------------------------------------------------------------------*/
412
413inline bool
414operator==(const XmlNode& n1,const XmlNode& n2)
415{
416 return n1.domNode()==n2.domNode();
417}
418
419inline bool
420operator!=(const XmlNode& n1,const XmlNode& n2)
421{
422 return n1.domNode()!=n2.domNode();
423}
424
425/*---------------------------------------------------------------------------*/
426/*---------------------------------------------------------------------------*/
427
428}
429
430/*---------------------------------------------------------------------------*/
431/*---------------------------------------------------------------------------*/
432
433#endif
434
Interface d'un gestionnaire de ressource.
Elément d'un arbre DOM.
Definition XmlNode.h:396
Noeud d'un arbre DOM.
Definition XmlNode.h:51
int difference_type
Type d'une distance entre itérateur éléments du tableau.
Definition XmlNode.h:71
Integer size_type
Type indexant le tableau.
Definition XmlNode.h:69
XmlNode value_type
Type des éléments du tableau.
Definition XmlNode.h:55
value_type & reference
Type référence d'un élément du tableau.
Definition XmlNode.h:65
const value_type & const_reference
Type référence constante d'un élément du tableau.
Definition XmlNode.h:67
value_type * pointer
Type pointeur d'un élément du tableau.
Definition XmlNode.h:61
const value_type * const_pointer
Type pointeur constant d'un élément du tableau.
Definition XmlNode.h:63
XmlNodeIterator iterator
Type de l'itérateur sur un élément du tableau.
Definition XmlNode.h:57
XmlNode prev() const
Noeud précédent (previousSibling())
Definition XmlNode.h:281
XmlNodeConstIterator const_iterator
Type de l'itérateur constant sur un élément du tableau.
Definition XmlNode.h:59
void append(const XmlNode &child_node)
Ajoute child_node comme fils de ce noeud.
Definition XmlNode.h:267
IterT< XmlNode > iter
Type d'un itérateur sur tout le tableau.
Definition XmlNode.h:74
XmlNode front() const
Premier fils.
Definition XmlNode.h:275
bool null() const
Vrai si le noeud est nul.
Definition XmlNode.h:294
XmlNode next() const
Noeud suivant (nextSibling())
Definition XmlNode.h:279
eType
NodeType An integer indicating which type of node this is.
Definition XmlNode.h:85
ConstIterT< XmlNode > const_iter
Type d'un itérateur constant sur tout le tableau.
Definition XmlNode.h:76
XmlNode parent() const
Parent de ce noeud (null si aucun)
Definition XmlNode.h:261
XmlNode last() const
Dernier fils.
Definition XmlNode.h:277
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
double Real
Type représentant un réel.
Int32 Integer
Type représentant un entier.