Arcane  4.1.12.0
User documentation
Loading...
Searching...
No Matches
XmlNode.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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.cc (C) 2000-2023 */
9/* */
10/* Any node in a DOM tree. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/XmlNode.h"
15
16#include "arcane/utils/StringBuilder.h"
17#include "arcane/utils/NotImplementedException.h"
18#include "arcane/utils/Iterator.h"
19#include "arcane/utils/ValueConvert.h"
20#include "arcane/utils/Iostream.h"
21#include "arcane/utils/TraceInfo.h"
22#include "arcane/utils/FatalErrorException.h"
23
24#include "arcane/core/XmlException.h"
25#include "arcane/core/XmlNodeList.h"
26#include "arcane/core/XmlNodeIterator.h"
27#include "arcane/core/DomUtils.h"
28
29#include <algorithm>
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34namespace Arcane
35{
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39
40class XmlNodeSameName
41{
42 public:
43
44 XmlNodeSameName(const String& name)
45 : m_name(name)
46 {}
47
48 public:
49
50 bool operator()(const XmlNode& node)
51 {
52 return node.name() == m_name;
53 }
54
55 private:
56
57 String m_name;
58};
59
60/*---------------------------------------------------------------------------*/
61/*---------------------------------------------------------------------------*/
62
63XmlNode XmlNode::
64_nullNode() const
65{
66 return XmlNode(m_rm);
67}
68
69/*---------------------------------------------------------------------------*/
70/*---------------------------------------------------------------------------*/
71
72XmlNode XmlNode::
73child(const String& child_name) const
74{
75 if (m_node._null())
76 return _nullNode();
77 XmlNodeSameName same_name(child_name);
78 XmlNodeConstIterator i = ARCANE_STD::find_if(begin(), end(), same_name);
79 if (i != end())
80 return *i;
81 return XmlNode(m_rm);
82}
83
84/*---------------------------------------------------------------------------*/
85/*---------------------------------------------------------------------------*/
86
87XmlNode XmlNode::
88expectedChild(const String& child_name) const
89{
90 if (m_node._null())
91 return _nullNode();
92 XmlNode c = child(child_name);
93 if (c.null())
94 ARCANE_FATAL("Can not find a child named '{0}' for node '{1}'", child_name, xpathFullName());
95 return c;
96}
97
98/*---------------------------------------------------------------------------*/
99/*---------------------------------------------------------------------------*/
100
102children(const String& child_name) const
103{
104 XmlNodeList nodes;
105 if (m_node._null())
106 return nodes;
107 XmlNodeSameName same_name(child_name);
108 for (XmlNodeConstIterator n = begin(); n != end(); ++n)
109 if (same_name(*n))
110 nodes.add(*n);
111 return nodes;
112}
113
114/*---------------------------------------------------------------------------*/
115/*---------------------------------------------------------------------------*/
116
118children() const
119{
120 XmlNodeList nodes;
121 if (m_node._null())
122 return nodes;
123 for (XmlNodeConstIterator n = begin(); n != end(); ++n)
124 nodes.add(*n);
125 return nodes;
126}
127
128/*---------------------------------------------------------------------------*/
129/*---------------------------------------------------------------------------*/
130
132type() const
133{
134 return static_cast<eType>(m_node.nodeType());
135}
136
137/*---------------------------------------------------------------------------*/
138/*---------------------------------------------------------------------------*/
139
141name() const
142{
143 if (m_node._null())
144 return String();
145 return String(m_node.nodeName());
146}
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
150
152xpathFullName() const
153{
154 StringBuilder full_name;
155 if (m_node._null())
156 return full_name;
157
158 XmlNode p = parent();
159 if (!p.null()) {
160 full_name = p.xpathFullName();
161 full_name.append("/");
162
163 if (m_node.nodeType() == dom::Node::ATTRIBUTE_NODE) {
164 full_name += "@";
165 full_name += name();
166 }
167 else if (m_node.nodeType() == dom::Node::ELEMENT_NODE) {
168 full_name.append(name());
169 Integer nb_occurence = 1;
170 for (XmlNode i = p.front(); i != (*this); ++i)
171 if (i.isNamed(name()))
172 ++nb_occurence;
173 if (nb_occurence > 1) {
174 full_name += "[";
175 full_name += nb_occurence;
176 full_name += "]";
177 }
178 }
179 else
180 full_name += "?";
181 }
182 else {
183 if (m_node.nodeType() == dom::Node::ATTRIBUTE_NODE) {
184 full_name = ownerElement().xpathFullName();
185 full_name += "/@";
186 full_name += name();
187 }
188 else {
189 full_name = String("/");
190 }
191 }
192 return full_name;
193}
194
195/*---------------------------------------------------------------------------*/
196/*---------------------------------------------------------------------------*/
197
199isNamed(const String& name) const
200{
201 return m_node.nodeName() == name;
202}
203
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206
208value() const
209{
210 if (null())
211 return String();
212 return _value();
213}
214
215/*---------------------------------------------------------------------------*/
216/*---------------------------------------------------------------------------*/
217
219setValue(const String& v)
220{
221 if (m_node._null())
222 return;
223 if (m_node.nodeType() == dom::Node::ELEMENT_NODE) {
224 domutils::textContent(m_node, v);
225 return;
226 }
227 m_node.nodeValue(v);
228}
229
230/*---------------------------------------------------------------------------*/
231/*---------------------------------------------------------------------------*/
232
234attrValue(const String& name, bool throw_exception) const
235{
236 String s = domutils::attrValue(m_node, name);
237 if (s.null() && throw_exception) {
238 ARCANE_THROW(XmlException, "No attribute named '{0}' child of '{1}'",
240 }
241 return s;
242}
243
244/*---------------------------------------------------------------------------*/
245/*---------------------------------------------------------------------------*/
246
248setAttrValue(const String& name, const String& value)
249{
250 domutils::setAttr(m_node, name, value);
251}
252
253/*---------------------------------------------------------------------------*/
254/*---------------------------------------------------------------------------*/
255
257attr(const String& name, bool throw_exception) const
258{
259 dom::Element elem(m_node);
260 if (elem._null())
261 return _nullNode();
262
263 XmlNode attr_node(m_rm, elem.getAttributeNode(name));
264 if (throw_exception && attr_node.null()) {
265 ARCANE_THROW(XmlException, "No attribute named '{0}' child of '{1}'",
267 }
268 return attr_node;
269}
270
271/*---------------------------------------------------------------------------*/
272/*---------------------------------------------------------------------------*/
273
275forceAttr(const String& name)
276{
277 dom::Element elem(m_node);
278 if (elem._null())
279 return _nullNode();
280 dom::Attr attr = elem.getAttributeNode(name);
281 if (attr._null()) {
282 attr = elem.ownerDocument().createAttribute(name);
283 attr = elem.setAttributeNode(attr);
284 }
285 return XmlNode(m_rm, attr);
286}
287
288/*---------------------------------------------------------------------------*/
289/*---------------------------------------------------------------------------*/
290
292removeAttr(const String& name) const
293{
294 dom::Element elem(m_node);
295 elem.removeAttribute(name);
296}
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
300
302clear()
303{
304 // Removes child nodes.
305 XmlNode n = front();
306 while (!n.null()) {
307 remove(n);
308 n = front();
309 }
310}
311
312/*---------------------------------------------------------------------------*/
313/*---------------------------------------------------------------------------*/
314
316remove()
317{
318 if (m_node._null())
319 return;
320 dom::Node parent = m_node.parentNode();
321 if (parent._null())
322 return;
323 parent.removeChild(m_node);
324}
325
326/*---------------------------------------------------------------------------*/
327/*---------------------------------------------------------------------------*/
328
330remove(const XmlNode& child_node)
331{
332 dom::Node child = m_node.removeChild(child_node.domNode());
333 child.releaseNode();
334}
335
336/*---------------------------------------------------------------------------*/
337/*---------------------------------------------------------------------------*/
338
340nextWithName(const String& name) const
341{
342 //\todo to test
343 if (m_node._null())
344 return _nullNode();
345 XmlNode n(next());
346 while (!n.null() && !n.isNamed(name))
347 ++n;
348 return n;
349}
350
351/*---------------------------------------------------------------------------*/
352/*---------------------------------------------------------------------------*/
353
355prevWithName(const String& name) const
356{
357 //\todo to test
358 if (m_node._null())
359 return _nullNode();
360 XmlNode n(prev());
361 while (!n.null() && !n.isNamed(name))
362 --n;
363 return n;
364}
365
366/*---------------------------------------------------------------------------*/
367/*---------------------------------------------------------------------------*/
368
370nextSameType() const
371{
372 //\todo to test
373 if (m_node._null())
374 return _nullNode();
375 XmlNode n(next());
376 while (!n.null() && n.type() != type())
377 ++n;
378 return n;
379}
380
381/*---------------------------------------------------------------------------*/
382/*---------------------------------------------------------------------------*/
383
385prevSameType() const
386{
387 //\todo to test
388 if (m_node._null())
389 return _nullNode();
390 XmlNode n(prev());
391 while (!n.null() && n.type() != type())
392 --n;
393 return n;
394}
395
396/*---------------------------------------------------------------------------*/
397/*---------------------------------------------------------------------------*/
398
400replace(const XmlNode& new_node, XmlNode& ref_node)
401{
402 if (m_node._null() || new_node.null() || ref_node.null())
403 return;
404 m_node.replaceChild(new_node.domNode(), ref_node.domNode());
405}
406
407/*---------------------------------------------------------------------------*/
408/*---------------------------------------------------------------------------*/
409
410void XmlNode::
411_throwBadConvert(const char* type_name, const String& value) const
412{
413 ARCANE_THROW(XmlException, "XML Node '{0}' can not convert value '{1}' to type '{2}'",
414 xpathFullName(), value, type_name);
415}
416
417/*---------------------------------------------------------------------------*/
418/*---------------------------------------------------------------------------*/
419
421valueAsBoolean(bool throw_exception) const
422{
423 if (null())
424 return false;
425 String value = _value();
426 if (value == "false" || value == "0")
427 return false;
428 if (value == "true" || value == "1")
429 return true;
430 if (throw_exception)
431 ARCANE_THROW(XmlException, "XML Node '{0}' can not convert value '{1}' to type 'bool'."
432 " Valid values are 'true', 'false', '0' (zero) or '1'.",
434 return false;
435}
436
437/*---------------------------------------------------------------------------*/
438/*---------------------------------------------------------------------------*/
439
441valueAsInteger(bool throw_exception) const
442{
443 if (null())
444 return 0;
445 String value = _value();
446 Integer v = 0;
447 if (builtInGetValue(v, value))
448 if (throw_exception)
449 _throwBadConvert("Integer", value);
450 return v;
451}
452
453/*---------------------------------------------------------------------------*/
454/*---------------------------------------------------------------------------*/
455
457valueAsInt64(bool throw_exception) const
458{
459 if (null())
460 return 0;
461 String value = _value();
462 Int64 v = 0;
463 if (builtInGetValue(v, value))
464 if (throw_exception)
465 _throwBadConvert("Int64", value);
466 return v;
467}
468
469/*---------------------------------------------------------------------------*/
470/*---------------------------------------------------------------------------*/
471
473valueAsReal(bool throw_exception) const
474{
475 if (null())
476 return 0.0;
477 String value = _value();
478 Real v = 0.0;
479 if (builtInGetValue(v, value))
480 if (throw_exception)
481 _throwBadConvert("Real", value);
482 return v;
483}
484
485/*---------------------------------------------------------------------------*/
486/*---------------------------------------------------------------------------*/
487
489childWithAttr(const String& elem_name, const String& attr_name,
490 const String& attr_value) const
491{
492 String name;
493 if (null())
494 return _nullNode();
495 for (XmlNode::const_iter i(*this); i(); ++i) {
496 if (!i->isNamed(elem_name))
497 continue;
498 name = i->attrValue(attr_name);
499 if (name == attr_value)
500 return *i;
501 }
502 return XmlNode(m_rm);
503}
504
505/*---------------------------------------------------------------------------*/
506/*---------------------------------------------------------------------------*/
507
509childWithNameAttr(const String& elem_name, const String& attr_value) const
510{
511 return childWithAttr(elem_name, String("name"), attr_value);
512}
513
514/*---------------------------------------------------------------------------*/
515/*---------------------------------------------------------------------------*/
516
518xpathNode(const String& xpath_expr) const
519{
520 return XmlNode(m_rm, domutils::nodeFromXPath(m_node, xpath_expr));
521}
522
523/*---------------------------------------------------------------------------*/
524/*---------------------------------------------------------------------------*/
525
526String XmlNode::
527_value() const
528{
529 if (m_node.nodeType() == dom::Node::ELEMENT_NODE)
530 return domutils::textContent(m_node);
531 return String(m_node.nodeValue());
532}
533
534/*---------------------------------------------------------------------------*/
535/*---------------------------------------------------------------------------*/
536
537void XmlNode::
538assignDomNode(const dom::Node& node)
539{
540 m_node = node;
541}
542
543/*---------------------------------------------------------------------------*/
544/*---------------------------------------------------------------------------*/
545
547insertAfter(const XmlNode& new_child, const XmlNode& ref_node)
548{
549 if (new_child.null())
550 return _nullNode();
551 XmlNode next = ref_node;
552 if (!next.null())
553 ++next;
554 if (next.null())
555 append(new_child);
556 else
557 m_node.insertBefore(new_child.domNode(), next.domNode());
558 return new_child;
559}
560
561/*---------------------------------------------------------------------------*/
562/*---------------------------------------------------------------------------*/
563
565documentElement() const
566{
567 dom::Document doc(m_node);
568 if (doc._null())
569 return _nullNode();
570 return _build(doc.documentElement());
571}
572
573/*---------------------------------------------------------------------------*/
574/*---------------------------------------------------------------------------*/
575
577ownerElement() const
578{
579 dom::Attr attr(m_node);
580 if (attr._null())
581 return _nullNode();
582 return _build(attr.ownerElement());
583}
584
585/*---------------------------------------------------------------------------*/
586/*---------------------------------------------------------------------------*/
587
588XmlNode XmlNode::
589createElement(const String& name)
590{
591 return createNode(ELEMENT, name);
592}
593
594/*---------------------------------------------------------------------------*/
595/*---------------------------------------------------------------------------*/
596
597XmlNode XmlNode::
598createAndAppendElement(const String& name, const String& value)
599{
600 XmlNode n = createNode(ELEMENT, name, value);
601 append(n);
602 return n;
603}
604
605/*---------------------------------------------------------------------------*/
606/*---------------------------------------------------------------------------*/
607
608XmlNode XmlNode::
609createAndAppendElement(const String& name)
610{
611 XmlNode n = createNode(ELEMENT, name);
612 append(n);
613 return n;
614}
615
616/*---------------------------------------------------------------------------*/
617/*---------------------------------------------------------------------------*/
618
620createNode(eType type, const String& name_or_value)
621{
622 dom::Document doc(m_node);
623 if (doc._null())
624 doc = m_node.ownerDocument();
625 XmlNode ret_node(m_rm);
626 String nov = name_or_value;
627 switch (type) {
628 case ELEMENT:
629 ret_node.assignDomNode(doc.createElement(nov));
630 break;
631 case TEXT:
632 ret_node.assignDomNode(doc.createTextNode(nov));
633 break;
634 default:
636 "createNode() not implemented for node type {0}", (int)type);
637 }
638 return ret_node;
639}
640
641/*---------------------------------------------------------------------------*/
642/*---------------------------------------------------------------------------*/
643
645createText(const String& value)
646{
647 return createNode(TEXT, value);
648}
649
650/*---------------------------------------------------------------------------*/
651/*---------------------------------------------------------------------------*/
652
654createNode(eType type, const String& name, const String& value)
655{
656 dom::Document doc(m_node);
657 if (doc._null())
658 doc = m_node.ownerDocument();
659 XmlNode ret_node(m_rm);
660 switch (type) {
661 case ELEMENT:
662 ret_node.assignDomNode(doc.createElement(name));
663 ret_node.setValue(value);
664 break;
665 case TEXT:
666 ret_node.assignDomNode(doc.createTextNode(value));
667 break;
668 default:
670 "createNode() not implemented for node type {0}", (int)type);
671 }
672 return ret_node;
673}
674
675/*---------------------------------------------------------------------------*/
676/*---------------------------------------------------------------------------*/
677
678XmlNode XmlNode::
679_build(const dom::Node& node) const
680{
681 return XmlNode(m_rm, node);
682}
683
684/*---------------------------------------------------------------------------*/
685/*---------------------------------------------------------------------------*/
686
687/*---------------------------------------------------------------------------*/
688/*---------------------------------------------------------------------------*/
689
691XmlElement(XmlNode& parent, const String& name, const String& value)
692: XmlNode(parent)
693{
694 _setNode(parent.createAndAppendElement(name, value).domNode());
695}
696
697/*---------------------------------------------------------------------------*/
698/*---------------------------------------------------------------------------*/
699
701XmlElement(XmlNode& parent, const String& name)
702: XmlNode(parent)
703{
704 _setNode(parent.createAndAppendElement(name).domNode());
705}
706
707/*---------------------------------------------------------------------------*/
708/*---------------------------------------------------------------------------*/
709
710/*---------------------------------------------------------------------------*/
711/*---------------------------------------------------------------------------*/
712
713XmlNodeNameIterator::
714XmlNodeNameIterator(const XmlNode& from, const String& ref_name)
715: m_parent(from)
716, m_current(0)
717, m_ref_name(ref_name)
718{
719 _findNextValid(true);
720}
721
722/*---------------------------------------------------------------------------*/
723/*---------------------------------------------------------------------------*/
724
725XmlNodeNameIterator::
726XmlNodeNameIterator(const XmlNode& from, const char* ref_name)
727: m_parent(from)
728, m_current(0)
729, m_ref_name(String(ref_name))
730{
731 _findNextValid(true);
732}
733
734/*---------------------------------------------------------------------------*/
735/*---------------------------------------------------------------------------*/
736
737void XmlNodeNameIterator::
738_findNextValid(bool is_init)
739{
740 if (is_init)
741 m_current = m_parent.front();
742 else {
743 if (m_current.null())
744 return;
745 ++m_current;
746 }
747 while (!m_current.null()) {
748 if (m_current.isNamed(m_ref_name))
749 break;
750 ++m_current;
751 }
752}
753
754/*---------------------------------------------------------------------------*/
755/*---------------------------------------------------------------------------*/
756
757} // namespace Arcane
758
759/*---------------------------------------------------------------------------*/
760/*---------------------------------------------------------------------------*/
#define ARCANE_THROW(exception_class,...)
Macro for throwing an exception with formatting.
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
void add(ConstReferenceType val)
Adds element val to the end of the array.
Unicode character string constructor.
StringBuilder & append(const String &str)
Appends str.
bool null() const
Returns true if the string is null.
Definition String.cc:306
XmlElement(XmlNode &parent, const String &name, const String &value)
Creates a child element of parent. The created element has the name name and the value value....
Definition XmlNode.cc:691
XML file related exceptions.
List of nodes of a DOM tree.
Definition XmlNodeList.h:36
Node of a DOM tree.
Definition XmlNode.h:51
XmlNode attr(const String &name, bool throw_exception=false) const
Returns the attribute of name name.
Definition XmlNode.cc:257
XmlNode prevSameType() const
Returns the previous node of the same type.
Definition XmlNode.cc:385
String xpathFullName() const
XPath name of the node with its ancestors.
Definition XmlNode.cc:152
void setValue(const String &value)
Sets the node value.
Definition XmlNode.cc:219
XmlNode documentElement() const
Returns the document element.
Definition XmlNode.cc:565
void replace(const XmlNode &new_node, XmlNode &ref_node)
Replaces the child node ref_node with the node new_node.
Definition XmlNode.cc:400
Int64 valueAsInt64(bool throw_exception=false) const
Node value converted to 64-bit integer. 0 if conversion fails.
Definition XmlNode.cc:457
eType type() const
Node type.
Definition XmlNode.cc:132
iterator end()
Returns an iterator over the first element after the end of the array.
XmlNode insertAfter(const XmlNode &new_child, const XmlNode &ref_node)
Inserts a node. Inserts the node new_child after the node ref_node. If new_child is null,...
Definition XmlNode.cc:547
XmlNodeList children() const
Set of child nodes of this node.
Definition XmlNode.cc:118
void removeAttr(const String &name) const
Removes the attribute of name name from this node. If this node is not an element,...
Definition XmlNode.cc:292
XmlNode prev() const
Previous node (previousSibling()).
Definition XmlNode.h:290
String attrValue(const String &name, bool throw_exception=false) const
Value of attribute name.
Definition XmlNode.cc:234
Real valueAsReal(bool throw_exception=false) const
Node value converted to real number. If conversion fails, if throw_exception is false returns 0....
Definition XmlNode.cc:473
XmlNode childWithNameAttr(const String &elem_name, const String &attr_value) const
Returns the child of this node having the name elem_name and an attribute of name "name" with value a...
Definition XmlNode.cc:509
XmlNode child(const String &name) const
Child node of this node with name name.
Definition XmlNode.cc:73
void clear()
Deletes all child nodes.
Definition XmlNode.cc:302
XmlNode forceAttr(const String &name)
Returns the attribute of name name. If no attribute with this name exists, an attribute with the null...
Definition XmlNode.cc:275
XmlNode xpathNode(const String &xpath_expr) const
Returns a node from an XPath expression.
Definition XmlNode.cc:518
void append(const XmlNode &child_node)
Adds child_node as a child of this node.
Definition XmlNode.h:276
String value() const
Node value.
Definition XmlNode.cc:208
XmlNode front() const
First child.
Definition XmlNode.h:284
XmlNode createText(const String &value)
Creates a text node.
Definition XmlNode.cc:645
bool null() const
True if the node is null.
Definition XmlNode.h:303
XmlNode next() const
Next node (nextSibling()).
Definition XmlNode.h:288
eType
NodeType An integer indicating which type of node this is.
Definition XmlNode.h:85
@ TEXT
The node is a Text node.
Definition XmlNode.h:91
@ ELEMENT
The node is an Element.
Definition XmlNode.h:87
ConstIterT< XmlNode > const_iter
Type of a constant iterator over the entire array.
Definition XmlNode.h:76
bool isNamed(const String &name) const
True if the element name is name.
Definition XmlNode.cc:199
XmlNode ownerElement() const
Returns the owning element of this attribute.
Definition XmlNode.cc:577
XmlNode expectedChild(const String &name) const
Child node of this node with name name.
Definition XmlNode.cc:88
XmlNode nextWithName(const String &name) const
Returns the next node after this node having the name name.
Definition XmlNode.cc:340
Integer valueAsInteger(bool throw_exception=false) const
Node value converted to integer.
Definition XmlNode.cc:441
XmlNode parent() const
Parent of this node (null if none).
Definition XmlNode.h:270
iterator begin()
Returns an iterator over the first element of the array.
XmlNode nextSameType() const
Returns the next node of the same type.
Definition XmlNode.cc:370
void setAttrValue(const String &name, const String &value)
Sets the attribute name to the value value.
Definition XmlNode.cc:248
XmlNode childWithAttr(const String &elem_name, const String &attr_name, const String &attr_value) const
Returns the child of this node having the name elem_name and an attribute of name attr_name with valu...
Definition XmlNode.cc:489
String name() const
Node name.
Definition XmlNode.cc:141
bool valueAsBoolean(bool throw_exception=false) const
Node value converted to boolean.
Definition XmlNode.cc:421
XmlNode createNode(eType type, const String &name, const String &value)
Creates a node of a given type.
Definition XmlNode.cc:654
XmlNode prevWithName(const String &name) const
Returns the previous node before this node having the name name.
Definition XmlNode.cc:355
void remove()
Removes this node from the document.
Definition XmlNode.cc:316
static const UShort ATTRIBUTE_NODE
The node is an Attr.
Definition Dom.h:234
static const UShort ELEMENT_NODE
The node is an Element.
Definition Dom.h:232
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int64_t Int64
Signed integer type of 64 bits.
Int32 Integer
Type representing an integer.
double Real
Type representing a real number.