Arcane  4.2.1.0
Developer documentation
Loading...
Searching...
No Matches
DomLibXml2V2.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/* DomLibXml2.cc (C) 2000-2026 */
9/* */
10/* Encapsulation of libxml2 DOM. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/NotImplementedException.h"
15#include "arcane/utils/Array.h"
16#include "arcane/utils/Iostream.h"
17#include "arcane/utils/ScopedPtr.h"
18#include "arcane/utils/StdHeader.h"
19#include "arcane/utils/ITraceMng.h"
20#include "arcane/utils/OStringStream.h"
21#include "arcane/utils/TraceInfo.h"
22#include "arcane/utils/StringBuilder.h"
23#include "arcane/utils/CheckedConvert.h"
24
25#include "arcane/core/Dom.h"
26#include "arcane/core/DomUtils.h"
27#include "arcane/core/ISharedReference.h"
28#include "arcane/core/XmlNode.h"
29#include "arcane/core/IXmlDocumentHolder.h"
30#include "arcane/core/XmlException.h"
31
32#include <libxml/tree.h>
33#include <libxml/parser.h>
34#include <libxml/xmlsave.h>
35#include <libxml/parserInternals.h>
36#include <libxml/xinclude.h>
37#include <libxml/xmlschemas.h>
38
39#include <memory>
40
41/*---------------------------------------------------------------------------*/
42/*---------------------------------------------------------------------------*/
43
44namespace Arcane::dom
45{
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
50// TODO: FOR NamedNodeMap, there is no corresponding type in libxml2
51// and since this can represent different types, a
52// specific type must be created to handle this.
54
55struct _wxmlText : _xmlNode
56{};
57struct _wxmlComment : _xmlNode
58{};
59struct _wxmlDocType : _xmlNode
60{};
61struct _wxmlDocumentFragment : _xmlNode
62{};
63struct _wxmlCDATA : _xmlNode
64{};
65struct _wxmlNodeList : _xmlNode
66{};
67struct _wxmlEntityReference : _xmlNode
68{};
69struct _wxmlCharacterData : _xmlNode
70{};
72{};
73struct _wxmlNamedNodeMapPtr : _xmlNode
74{};
75
76typedef _wxmlNamedNodeMapPtr* xmlNamedNodeMapPtr;
77typedef _wxmlDocType* xmlDocTypePtr;
78typedef _wxmlDocumentFragment* xmlDocumentFragmentPtr;
79typedef _wxmlCharacterData* xmlCharacterDataPtr;
80typedef _wxmlNodeList* xmlNodeListPtr;
81typedef _wxmlEntityReference* xmlEntityReferencePtr;
82typedef _wxmlProcessingInstruction* xmlProcessingInstructionPtr;
83typedef _wxmlCDATA* xmlCDATAPtr;
84typedef _wxmlText* xmlTextPtr;
85typedef _wxmlComment* xmlCommentPtr;
86
87static xmlNodePtr impl(NodePrv* p)
88{
89 return (xmlNodePtr)p;
90}
91static xmlAttrPtr impl(AttrPrv* p)
92{
93 return (xmlAttrPtr)p;
94}
95static xmlElementPtr impl(ElementPrv* p)
96{
97 return (xmlElementPtr)p;
98}
99static xmlNamedNodeMapPtr impl(NamedNodeMapPrv* p)
100{
101 return (xmlNamedNodeMapPtr)p;
102}
103static xmlDocPtr impl(DocumentPrv* p)
104{
105 return (xmlDocPtr)p;
106}
107static xmlDocTypePtr impl(DocumentTypePrv* p)
108{
109 return (xmlDocTypePtr)p;
110}
111[[maybe_unused]] static LibXml2_DOMImplementation* impl(ImplementationPrv* p)
112{
113 return (LibXml2_DOMImplementation*)p;
114}
115static xmlCharacterDataPtr impl(CharacterDataPrv* p)
116{
117 return (xmlCharacterDataPtr)p;
118}
119static xmlTextPtr impl(TextPrv* p)
120{
121 return (xmlTextPtr)p;
122}
123[[maybe_unused]] static xmlNodeListPtr impl(NodeListPrv* p)
124{
125 return (xmlNodeListPtr)p;
126}
127static xmlDocumentFragmentPtr impl(DocumentFragmentPrv* p)
128{
129 return (xmlDocumentFragmentPtr)p;
130}
131static xmlCDATAPtr impl(CDATASectionPrv* p)
132{
133 return (xmlCDATAPtr)p;
134}
135static xmlProcessingInstructionPtr impl(ProcessingInstructionPrv* p)
136{
137 return (xmlProcessingInstructionPtr)p;
138}
139static xmlEntityReferencePtr impl(EntityReferencePrv* p)
140{
141 return (xmlEntityReferencePtr)p;
142}
143[[maybe_unused]] static xmlEntityPtr impl(EntityPrv* p)
144{
145 return (xmlEntityPtr)p;
146}
147[[maybe_unused]] static xmlNotationPtr impl(NotationPrv* p)
148{
149 return (xmlNotationPtr)p;
150}
151//static ::DOMError* impl(DOMErrorPrv* p) { return (::DOMError*)p; }
152//static ::DOMLocator* impl(DOMLocatorPrv* p) { return (::DOMLocator*)p; }
153
154static NodePrv* cvt(xmlNodePtr p)
155{
156 return (NodePrv*)p;
157}
158static AttrPrv* cvt(xmlAttrPtr p)
159{
160 return (AttrPrv*)p;
161}
162static ElementPrv* cvt(xmlElementPtr p)
163{
164 return (ElementPrv*)p;
165}
166static NamedNodeMapPrv* cvt(xmlNamedNodeMapPtr p)
167{
168 return (NamedNodeMapPrv*)p;
169}
170static DocumentPrv* cvt(xmlDocPtr p)
171{
172 return (DocumentPrv*)p;
173}
174static DocumentTypePrv* cvt(xmlDocTypePtr p)
175{
176 return (DocumentTypePrv*)p;
177}
178static ImplementationPrv* cvt(LibXml2_DOMImplementation* p)
179{
180 return (ImplementationPrv*)p;
181}
182static CharacterDataPrv* cvt(xmlCharacterDataPtr p)
183{
184 return (CharacterDataPrv*)p;
185}
186static TextPrv* cvt(xmlTextPtr p)
187{
188 return (TextPrv*)p;
189}
190[[maybe_unused]] static NodeListPrv* cvt(xmlNodeListPtr p)
191{
192 return (NodeListPrv*)p;
193}
194[[maybe_unused]] static DocumentFragmentPrv* cvt(xmlDocumentFragmentPtr p)
195{
196 return (DocumentFragmentPrv*)p;
197}
198[[maybe_unused]] static CommentPrv* cvt(xmlCommentPtr p)
199{
200 return (CommentPrv*)p;
201}
202[[maybe_unused]] static CDATASectionPrv* cvt(xmlCDATAPtr p)
203{
204 return (CDATASectionPrv*)p;
205}
206static ProcessingInstructionPrv* cvt(xmlProcessingInstructionPtr p)
207{
208 return (ProcessingInstructionPrv*)p;
209}
210[[maybe_unused]] static EntityReferencePrv* cvt(xmlEntityReferencePtr p)
211{
212 return (EntityReferencePrv*)p;
213}
214static EntityPrv* cvt(xmlEntityPtr p)
215{
216 return (EntityPrv*)p;
217}
218static NotationPrv* cvt(xmlNotationPtr p)
219{
220 return (NotationPrv*)p;
221}
222//static DOMLocatorPrv* cvt(::DOMLocator* p) { return (DOMLocatorPrv*)p; }
223
224/*---------------------------------------------------------------------------*/
225/*---------------------------------------------------------------------------*/
226typedef char XMLCh;
227
228const xmlChar*
229domStringToXmlChar(const String& str)
230{
231 const xmlChar* ch = reinterpret_cast<const xmlChar*>(str.utf8().data());
232 return ch;
233}
234
235const xmlChar*
236toChar(const String& value)
237{
238 return domStringToXmlChar(value);
239}
240
241String fromChar(const xmlChar* value)
242{
243 if (!value)
244 return DOMString();
245 Integer len = ::xmlStrlen(value);
246 // Ne pas oublier le '\0' terminal
247 ByteConstArrayView bytes(len + 1, value);
248 return DOMString(bytes);
249}
250
251String fromCharAndFree(xmlChar* value)
252{
253 if (!value)
254 return DOMString();
255 String s(fromChar(value));
256 ::xmlFree(value);
257 return s;
258}
259
260/*---------------------------------------------------------------------------*/
261/*---------------------------------------------------------------------------*/
262
263NodePrv* toNodePrv(const Node& node)
264{
265 return node._impl();
266}
267
268/*---------------------------------------------------------------------------*/
269/*---------------------------------------------------------------------------*/
270
271/*---------------------------------------------------------------------------*/
272/*---------------------------------------------------------------------------*/
273
274#define TNIE throw NotImplementedException(A_FUNCINFO)
275
276/*---------------------------------------------------------------------------*/
277/*---------------------------------------------------------------------------*/
278
280{
281 public:
282
283 static LibXml2_DOMImplementation sDOMImplementation;
284 static LibXml2_DOMImplementation* getImplementation()
285 {
286 return &sDOMImplementation;
287 }
288};
289
290LibXml2_DOMImplementation LibXml2_DOMImplementation::sDOMImplementation;
291
292/*---------------------------------------------------------------------------*/
293/*---------------------------------------------------------------------------*/
294
301class LibXml2_ErrorHandler
302{
303 public:
304
305 LibXml2_ErrorHandler()
306 {
307 ::xmlSetStructuredErrorFunc(this, &LibXml2_ErrorHandler::handler);
308 }
309 ~LibXml2_ErrorHandler()
310 {
311 ::xmlSetStructuredErrorFunc(nullptr, nullptr);
312 }
313
314 public:
315
317 template <class T>
318 static void XMLCDECL handler(void* user_data, T* e)
319 {
320 if (!e)
321 return;
322 auto x = reinterpret_cast<LibXml2_ErrorHandler*>(user_data);
323 if (!x)
324 return;
325 x->addError(e);
326 }
327
328 public:
329
330 const String& errorMessage() const { return m_error_message; }
331
332 private:
333
334 String m_error_message;
335
336 public:
337
338 void addError(const xmlError* e)
339 {
340 StringBuilder sb;
341 if (e->level == XML_ERR_WARNING)
342 sb += "(warning):";
343 else if (e->level == XML_ERR_ERROR)
344 sb += "(error):";
345 else if (e->level == XML_ERR_FATAL)
346 sb += "(fatal):";
347
348 sb += " domain ";
349 sb += e->domain;
350 sb += " errcode ";
351 sb += e->code;
352
353 if (e->line > 0) {
354 sb += " line ";
355 sb += e->line;
356 if (e->int2 > 0) {
357 sb += " column ";
358 sb += e->int2;
359 }
360 }
361 sb += " : ";
362 if (e->message)
363 sb += e->message;
364 else
365 sb += "(unknown)";
366 m_error_message = m_error_message + sb.toString();
367 }
368};
369
370/*---------------------------------------------------------------------------*/
371/*---------------------------------------------------------------------------*/
372
373class ILibXml2_Reader;
374
375/*---------------------------------------------------------------------------*/
376/*---------------------------------------------------------------------------*/
377
381class LibXml2_Parser
382{
383 public:
384
385 LibXml2_Parser(const String& file_name, ITraceMng* trace)
386 : m_file_name(file_name)
387 , m_trace(trace)
388 {
389 // Les versions après 2015 de LibXml2 limitent à 10Mo la longueur de chaque noeud XML.
390 // Avec cette option, on relâche cette contrainte qui passe à 1Go.
391 m_options = XML_PARSE_HUGE;
392 }
393
394 public:
395
406 IXmlDocumentHolder* parse(ILibXml2_Reader* reader, const String& schema_name,
407 ByteConstArrayView schema_data);
408
409 public:
410
411 const String& fileName() const { return m_file_name; }
412 int options() const { return m_options; }
413
414 private:
415
416 String m_file_name;
417 ITraceMng* m_trace = nullptr;
418 int m_options = 0;
419
420 private:
421
422 void _applySchema(::xmlDocPtr doc, LibXml2_ErrorHandler& err_handler,
423 const String& schema_name, ByteConstArrayView schema_data);
424};
425
426/*---------------------------------------------------------------------------*/
427/*---------------------------------------------------------------------------*/
428
432class LibXml2_SchemaValidator
433{
434 public:
435
436 LibXml2_SchemaValidator(const String& schema_file_name)
437 : m_schema_file_name(schema_file_name)
438 , m_schema_parser_context(nullptr)
439 , m_schema_ptr(nullptr)
440 , m_schema_valid_context(nullptr)
441 {
442 }
443 ~LibXml2_SchemaValidator()
444 {
445 _clearMemory();
446 }
447
448 public:
449
460 void validate(::xmlDocPtr doc, ByteConstArrayView schema_data);
461
462 private:
463
464 String m_schema_file_name;
465 ::xmlSchemaParserCtxtPtr m_schema_parser_context;
466 ::xmlSchemaPtr m_schema_ptr;
467 ::xmlSchemaValidCtxtPtr m_schema_valid_context;
468
469 private:
470
471 void _clearMemory()
472 {
473 if (m_schema_parser_context) {
474 ::xmlSchemaFreeParserCtxt(m_schema_parser_context);
475 m_schema_parser_context = nullptr;
476 }
477 if (m_schema_ptr) {
478 ::xmlSchemaFree(m_schema_ptr);
479 m_schema_ptr = nullptr;
480 }
481 if (m_schema_valid_context) {
482 ::xmlSchemaFreeValidCtxt(m_schema_valid_context);
483 m_schema_valid_context = nullptr;
484 }
485 }
486};
487
488/*---------------------------------------------------------------------------*/
489/*---------------------------------------------------------------------------*/
490
492{
493 public:
494
495 virtual ~ILibXml2_Reader() {}
496
497 public:
498
499 virtual ::xmlDocPtr read(LibXml2_Parser& context) = 0;
500};
501
502/*---------------------------------------------------------------------------*/
503/*---------------------------------------------------------------------------*/
504
505class LibXml2_MemoryReader
506: public ILibXml2_Reader
507{
508 public:
509
510 LibXml2_MemoryReader(ByteConstSpan buffer)
511 : m_buffer(buffer)
512 {}
513
514 public:
515
516 ::xmlDocPtr read(LibXml2_Parser& parser) override
517 {
518 const char* encoding = nullptr;
519 int options = parser.options();
520 const char* buf_base = reinterpret_cast<const char*>(m_buffer.data());
521 // TODO: check if there is a 64-bit reading version
522 // that also works on older versions of LibXml2
523 // (for RHEL6 support)
524 int buf_size = CheckedConvert::toInt32(m_buffer.size());
525 while (buf_size > 0 && static_cast<char>(m_buffer[buf_size - 1]) == '\0') {
526 buf_size--;
527 }
528 const String& name = parser.fileName();
529 ::xmlParserCtxtPtr ctxt = ::xmlNewParserCtxt();
530 ::xmlDocPtr doc = ::xmlCtxtReadMemory(ctxt, buf_base, buf_size,
531 name.localstr(), encoding, options);
532 ::xmlFreeParserCtxt(ctxt);
533 return doc;
534 }
535
536 private:
537
538 ByteConstSpan m_buffer;
539};
540
541/*---------------------------------------------------------------------------*/
542/*---------------------------------------------------------------------------*/
543
544class LibXml2_FileReader
545: public ILibXml2_Reader
546{
547 public:
548
549 LibXml2_FileReader(const String& file_name)
550 : m_file_name(file_name)
551 {}
552
553 public:
554
555 ::xmlDocPtr read(LibXml2_Parser& parser) override
556 {
557 const char* encoding = nullptr;
558 int options = parser.options();
559 const char* file_name = m_file_name.localstr();
560 ::xmlParserCtxtPtr ctxt = ::xmlNewParserCtxt();
561 ::xmlDocPtr doc = ::xmlCtxtReadFile(ctxt, file_name, encoding, options);
562 ::xmlFreeParserCtxt(ctxt);
563 return doc;
564 }
565
566 private:
567
568 String m_file_name;
569};
570
571/*---------------------------------------------------------------------------*/
572/*---------------------------------------------------------------------------*/
573
574class XmlDocumentHolderLibXml2
575: public IXmlDocumentHolder
576{
577 public:
578
579 XmlDocumentHolderLibXml2()
580 : m_document(nullptr)
581 , m_document_node(nullptr)
582 {}
583 ~XmlDocumentHolderLibXml2()
584 {
585 if (m_document) {
586 ::xmlDocPtr doc = impl(m_document);
587 ::xmlFreeDoc(doc);
588 }
589 }
590 XmlNode documentNode() override { return XmlNode(nullptr, m_document_node); }
591 IXmlDocumentHolder* clone() override { TNIE; }
592 void save(ByteArray& bytes) override
593 {
595 domimp._save(bytes, m_document, (-1));
596 }
597 String save() override
598 {
599 //TODO verify that we always save in UTF8.
600 ByteUniqueArray bytes;
601 save(bytes);
602 String new_s = String::fromUtf8(bytes);
603 return new_s;
604 }
605
606 public:
607
608 void assignDocument(DocumentPrv* doc)
609 {
610 m_document = doc;
611 m_document_node = (NodePrv*)doc;
612 }
613 DocumentPrv* _document() const { return m_document; }
614
615 private:
616
617 DocumentPrv* m_document;
618 NodePrv* m_document_node;
619};
620
621/*---------------------------------------------------------------------------*/
622/*---------------------------------------------------------------------------*/
623
624DOMImplementation::
625DOMImplementation()
626: m_p(nullptr)
627{
628 m_p = cvt(LibXml2_DOMImplementation::getImplementation());
629}
630
631DOMImplementation::
632DOMImplementation(ImplementationPrv* prv)
633: m_p(prv)
634{
635}
636
637DOMImplementation::
638~DOMImplementation()
639{
640}
641
642void DOMImplementation::
643_checkValid() const
644{
645 if (!m_p)
647}
648
649ImplementationPrv* DOMImplementation::
650_impl() const
651{
652 return m_p;
653}
654
655bool DOMImplementation::
656hasFeature(const DOMString& feature, const DOMString& version) const
657{
658 ARCANE_UNUSED(feature);
659 ARCANE_UNUSED(version);
660 _checkValid();
661 TNIE;
662 //return impl(m_p)->hasFeature(toChar(feature),toChar(version));
663}
664
665DocumentType DOMImplementation::
666createDocumentType(const DOMString& qualified_name, const DOMString& public_id,
667 const DOMString& system_id) const
668{
669 ARCANE_UNUSED(qualified_name);
670 ARCANE_UNUSED(public_id);
671 ARCANE_UNUSED(system_id);
672 _checkValid();
673 TNIE;
674 //return cvt(impl(m_p)->createDocumentType(toChar(qualified_name),toChar(public_id),
675 // toChar(system_id)));
676}
677
678DOMImplementation DOMImplementation::
679getInterface(const DOMString& feature) const
680{
681 _checkValid();
682 ARCANE_UNUSED(feature);
683 throw NotImplementedException(A_FUNCINFO);
684}
685
686DOMWriter DOMImplementation::
687createDOMWriter() const
688{
689 _checkValid();
690 throw NotImplementedException(A_FUNCINFO);
691}
692
693/*---------------------------------------------------------------------------*/
694/*---------------------------------------------------------------------------*/
695
700createDocument(const DOMString& namespace_uri, const DOMString& qualified_name,
701 const DocumentType& doctype) const
702{
703 if (!namespace_uri.null())
704 ARCANE_THROW(NotImplementedException, "non nul namespace-uri");
705 if (!qualified_name.null())
706 ARCANE_THROW(NotImplementedException, "non nul qualified-name");
707 if (!doctype._null())
708 ARCANE_THROW(NotImplementedException, "non nul doctype");
709 const xmlChar* xml_version = nullptr;
710 xmlDocPtr doc = ::xmlNewDoc(xml_version);
711 return cvt(doc);
712}
713
714/*---------------------------------------------------------------------------*/
715/*---------------------------------------------------------------------------*/
716
717String DOMImplementation::
718_implementationName() const
719{
720 return "libxml2";
721}
722
723/*---------------------------------------------------------------------------*/
724/*---------------------------------------------------------------------------*/
725
726IXmlDocumentHolder* DOMImplementation::
728{
729 Document _doc = createDocument(DOMString(), DOMString(), DocumentType());
730 auto xml_doc = new XmlDocumentHolderLibXml2();
731 xml_doc->assignDocument(_doc._impl());
732 return xml_doc;
733}
734
735/*---------------------------------------------------------------------------*/
736/*---------------------------------------------------------------------------*/
737
738IXmlDocumentHolder* DOMImplementation::
739_load(const String& fname, ITraceMng* msg, const String& schemaname)
740{
741 return _load(fname, msg, schemaname, ByteConstArrayView());
742}
743
744/*---------------------------------------------------------------------------*/
745/*---------------------------------------------------------------------------*/
746
747IXmlDocumentHolder* DOMImplementation::
748_load(const String& fname, ITraceMng* trace, const String& schema_name,
749 ByteConstArrayView schema_data)
750{
751 _checkValid();
752 LibXml2_FileReader reader(fname);
753 LibXml2_Parser parser(fname, trace);
754 auto doc_holder = parser.parse(&reader, schema_name, schema_data);
755 return doc_holder;
756}
757
758/*---------------------------------------------------------------------------*/
759/*---------------------------------------------------------------------------*/
760
761IXmlDocumentHolder* DOMImplementation::
762_load(ByteConstSpan buffer, const String& name, ITraceMng* trace)
763{
764 _checkValid();
765 if (buffer.empty())
766 return new XmlDocumentHolderLibXml2();
767
768 LibXml2_MemoryReader reader(buffer);
769 LibXml2_Parser parser(name, trace);
770 auto doc_holder = parser.parse(&reader, String(), ByteConstArrayView());
771 return doc_holder;
772}
773
774/*---------------------------------------------------------------------------*/
775/*---------------------------------------------------------------------------*/
776
777void DOMImplementation::
778_save(ByteArray& bytes, const Document& document, int indent_level)
779{
780 ARCANE_UNUSED(indent_level);
781 // NOTE: Recent versions of libxml2 (2.9.0) use a new
782 // API for buffers via the xmlBufContent() methods (to retrieve
783 // the content) and xmlBufUse() (to retrieve the used size).
784 // Both these methods allow handling buffers larger
785 // than 2GB.
786 // However, on RHEL6, the default libxml2 version is too
787 // old, so we must support the old methods.
788 // The macro 'LIBXML2_NEW_BUFFER' is defined if we can use the
789 // new mechanism.
790 xmlDocPtr doc = impl(document._impl());
791 xmlBufferPtr buf = ::xmlBufferCreate();
792
793 int options = 0;
794 if (indent_level > 0)
795 options = XML_SAVE_FORMAT;
796 xmlSaveCtxtPtr ctx = ::xmlSaveToBuffer(buf, nullptr, options);
797 (void)::xmlSaveDoc(ctx, doc);
798 (void)::xmlSaveClose(ctx);
799
800 const xmlChar* content = ::xmlBufferContent(buf);
801 size_t content_len = ::xmlBufferLength(buf);
802
803 Integer buf_view_size = arcaneCheckArraySize(content_len);
804 ByteConstArrayView buf_view(buf_view_size, (const Byte*)content);
805 bytes.copy(buf_view);
806 // TODO: protect the buffer from possible exceptions in bytes.copy().
807 ::xmlBufferFree(buf);
808}
809
810/*---------------------------------------------------------------------------*/
811/*---------------------------------------------------------------------------*/
812
814parse(ILibXml2_Reader* reader, const String& schema_name,
815 ByteConstArrayView schema_data)
816{
817 std::unique_ptr<XmlDocumentHolderLibXml2> xml_parser(new XmlDocumentHolderLibXml2());
818
819 m_options |= XML_PARSE_DTDLOAD | XML_PARSE_NOENT | XML_PARSE_DTDATTR;
820 m_options |= XML_PARSE_XINCLUDE;
821
822 ::xmlDocPtr doc_ptr = nullptr;
823
824 {
825 // Note: the error handler is managed by libxml2 per thread.
826 // Therefore, it is not necessary to protect it in multi-threading.
827 LibXml2_ErrorHandler err_handler;
828
829 doc_ptr = reader->read(*this);
830
831 if (!doc_ptr)
832 ARCANE_THROW(XmlException, "Could not parse document '{0}'\n{1}", fileName(),
833 err_handler.errorMessage());
834
835 // Assigns the document to ensure its release in case of an exception.
836 xml_parser->assignDocument(cvt(doc_ptr));
837
838 // Performs XInclude replacement. The ::xmlXIncludeProcess()
839 // returns the number of substitutions or (-1) in case of an error.
840 int nb_xinclude = ::xmlXIncludeProcess(doc_ptr);
841 if (nb_xinclude == (-1))
842 ARCANE_THROW(XmlException, "Could not parse xinclude for document '{0}'\n{1}", fileName(),
843 err_handler.errorMessage());
844
845 // Even if the reading is correct, there may be
846 // warning messages to display.
847 String err_message = err_handler.errorMessage();
848 if (m_trace && !err_message.null())
849 m_trace->info() << "Info parsing document " << fileName() << " : " << err_message;
850 }
851
852 // Uncomment to debug if you want to display the read document.
853 //::xmlDocDump(stdout,doc_ptr);
854
855 {
856 LibXml2_SchemaValidator validator(schema_name);
857 validator.validate(doc_ptr, schema_data);
858 }
859
860 return xml_parser.release();
861}
862
863/*---------------------------------------------------------------------------*/
864/*---------------------------------------------------------------------------*/
865
867validate(::xmlDocPtr doc_ptr, ByteConstArrayView schema_data)
868{
869 // We must provide schema_name or schema_data or both.
870 // If 'schema_data' is provided, we use it and consider that
871 // 'schema_name' is the corresponding file name.
872 if (m_schema_file_name.null() && schema_data.empty())
873 return;
874 _clearMemory();
875 LibXml2_ErrorHandler err_handler;
876 if (!schema_data.empty()) {
877 auto base_ptr = reinterpret_cast<const char*>(schema_data.data());
878 m_schema_parser_context = ::xmlSchemaNewMemParserCtxt(base_ptr, schema_data.size());
879 }
880 else
881 m_schema_parser_context = ::xmlSchemaNewParserCtxt(m_schema_file_name.localstr());
882 if (!m_schema_parser_context)
883 ARCANE_THROW(XmlException, "Can not create schema parser");
884 m_schema_ptr = xmlSchemaParse(m_schema_parser_context);
885 if (!m_schema_ptr)
886 ARCANE_THROW(XmlException, "Can not read schema file '{0}'\n{1}", m_schema_file_name,
887 err_handler.errorMessage());
888 m_schema_valid_context = xmlSchemaNewValidCtxt(m_schema_ptr);
889 if (!m_schema_valid_context)
890 ARCANE_THROW(XmlException, "Can not create valid context for file '{0}'\n{1}",
891 m_schema_file_name, err_handler.errorMessage());
892 xmlSchemaSetValidOptions(m_schema_valid_context, XML_SCHEMA_VAL_VC_I_CREATE);
893 int result = xmlSchemaValidateDoc(m_schema_valid_context, doc_ptr);
894 if (result != 0)
895 ARCANE_THROW(XmlException, "Can not validate file '{0}'\n{1}",
896 m_schema_file_name, err_handler.errorMessage());
897}
898
899/*---------------------------------------------------------------------------*/
900/*---------------------------------------------------------------------------*/
901
902/*---------------------------------------------------------------------------*/
903/*---------------------------------------------------------------------------*/
904
905Node::
906Node()
907: m_p(0)
908{}
909Node::
910Node(NodePrv* p)
911: m_p(p)
912{
913}
914Node::
915Node(const Node& from)
916: m_p(from.m_p)
917{
918}
919const Node& Node::
920operator=(const Node& from)
921{
922 _assign(from);
923 return (*this);
924}
925Node::
926~Node()
927{}
928bool Node::
929_null() const
930{
931 return !m_p;
932}
933void Node::
934_checkValid() const
935{
936 if (_null())
938}
939NodePrv* Node::
940_impl() const
941{
942 return m_p;
943}
944
945UShort Node::
946nodeType() const
947{
948 _checkValid();
949 // The type returned by libxml2 (of type xmlElementType) corresponds to that of the DOM
950 // with the same values. Therefore, we just need to cast the value.
951 return (UShort)(impl(m_p)->type);
952}
953Node Node::
954firstChild() const
955{
956 _checkValid();
957 ::xmlNodePtr first_children = impl(m_p)->children;
958 return cvt(first_children);
959}
960Node Node::
961lastChild() const
962{
963 _checkValid();
964 TNIE;
965 //return cvt(impl(m_p)->getLastChild());
966}
967Node Node::
968previousSibling() const
969{
970 _checkValid();
971 TNIE;
972 //return cvt(impl(m_p)->getPreviousSibling());
973}
974Node Node::
975nextSibling() const
976{
977 _checkValid();
978 xmlNodePtr next_node = impl(m_p)->next;
979 return cvt(next_node);
980}
981Node Node::
982parentNode() const
983{
984 _checkValid();
985 return cvt(impl(m_p)->parent);
986}
987NodeList Node::
988childNodes() const
989{
990 _checkValid();
991 TNIE;
992 //return cvt(impl(m_p)->getChildNodes());
993}
994DOMString Node::
995nodeName() const
996{
997 _checkValid();
998 //if (impl(m_p)->type==XML_ELEMENT_NODE)
999 //std::cerr << "NODE_NAME =" << impl(m_p)->name << " content=" << impl(m_p)->content << "\n";
1000 return fromChar(impl(m_p)->name);
1001}
1002NamedNodeMap Node::
1003attributes() const
1004{
1005 _checkValid();
1006 ::xmlNodePtr xelement = impl(m_p);
1007 xmlAttrPtr p = xelement->properties;
1008 return cvt((xmlNamedNodeMapPtr)(p));
1009}
1010Document Node::
1011ownerDocument() const
1012{
1013 _checkValid();
1014 ::xmlNodePtr node = impl(m_p);
1015 return cvt(node->doc);
1016}
1017DOMString Node::
1018nodeValue() const
1019{
1020 _checkValid();
1021 xmlChar* content = ::xmlNodeGetContent(impl(m_p));
1022 return fromCharAndFree(content);
1023}
1024void Node::
1025nodeValue(const DOMString& str) const
1026{
1027 ARCANE_UNUSED(str);
1028 _checkValid();
1029 TNIE;
1030 //impl(m_p)->setNodeValue(toChar(str));
1031}
1032void Node::
1033_assign(const Node& node)
1034{
1035 m_p = node.m_p;
1036}
1037Node Node::
1038insertBefore(const Node& new_child, const Node& ref_child) const
1039{
1040 ARCANE_UNUSED(new_child);
1041 ARCANE_UNUSED(ref_child);
1042 _checkValid();
1043 TNIE;
1044 //return cvt(impl(m_p)->insertBefore(impl(new_child._impl()),impl(ref_child._impl())));
1045}
1046Node Node::
1047replaceChild(const Node& new_child, const Node& old_child) const
1048{
1049 ARCANE_UNUSED(new_child);
1050 ARCANE_UNUSED(old_child);
1051 _checkValid();
1052 TNIE;
1053 //return cvt(impl(m_p)->replaceChild(impl(new_child._impl()),impl(old_child._impl())));
1054}
1055Node Node::
1056removeChild(const Node& old_child) const
1057{
1058 _checkValid();
1059 ::xmlNodePtr xchild = impl(old_child._impl());
1060 // Attention, the node must then be destroyed via Node::releaseNode())
1061 // to free the memory.
1062 ::xmlUnlinkNode(xchild);
1063 return cvt(xchild);
1064}
1065Node Node::
1066appendChild(const Node& new_child) const
1067{
1068 _checkValid();
1069 return cvt(::xmlAddChild(impl(m_p), impl(new_child._impl())));
1070}
1071bool Node::
1072hasChildNodes() const
1073{
1074 _checkValid();
1075 TNIE;
1076 //return impl(m_p)->hasChildNodes();
1077}
1078Node Node::
1079cloneNode(bool deep) const
1080{
1081 _checkValid();
1082 ARCANE_UNUSED(deep);
1083 TNIE;
1084 //return cvt(impl(m_p)->cloneNode(deep));
1085}
1086DOMString Node::
1087prefix() const
1088{
1089 _checkValid();
1090 TNIE;
1091 //return fromChar(impl(m_p)->getPrefix());
1092}
1093void Node::
1094prefix(const DOMString& new_prefix) const
1095{
1096 _checkValid();
1097 ARCANE_UNUSED(new_prefix);
1098 TNIE;
1099 //impl(m_p)->setPrefix(toChar(new_prefix));
1100}
1101void Node::
1102normalize() const
1103{
1104 _checkValid();
1105 TNIE;
1106 //impl(m_p)->normalize();
1107}
1108bool Node::
1109isSupported(const DOMString& feature, const DOMString& version) const
1110{
1111 ARCANE_UNUSED(feature);
1112 ARCANE_UNUSED(version);
1113 _checkValid();
1114 TNIE;
1115 //return impl(m_p)->isSupported(toChar(feature),toChar(version));
1116}
1117DOMString Node::
1118namespaceURI() const
1119{
1120 _checkValid();
1121 TNIE;
1122 //return fromChar(impl(m_p)->getNamespaceURI());
1123}
1124DOMString Node::
1125localName() const
1126{
1127 _checkValid();
1128 return fromChar(impl(m_p)->name);
1129}
1130DOMString Node::
1131baseURI() const
1132{
1133 _checkValid();
1134 TNIE;
1135 //return fromChar(impl(m_p)->getBaseURI());
1136}
1137DOMString Node::
1138textContent() const
1139{
1140 _checkValid();
1141 TNIE;
1142 //return fromChar(impl(m_p)->getTextContent());
1143}
1144void Node::
1145textContent(const DOMString& value) const
1146{
1147 _checkValid();
1148 ARCANE_UNUSED(value);
1149 TNIE;
1150 //impl(m_p)->setTextContent(toChar(value));
1151}
1152bool Node::
1153isSameNode(const Node& node) const
1154{
1155 _checkValid();
1156 ARCANE_UNUSED(node);
1157 TNIE;
1158 //return impl(m_p)->isSameNode(impl(node.m_p));
1159}
1160bool Node::
1161isEqualNode(const Node& other) const
1162{
1163 _checkValid();
1164 ARCANE_UNUSED(other);
1165 TNIE;
1166 //return impl(m_p)->isEqualNode(impl(other._impl()));
1167}
1168bool Node::
1169isDefaultNamespace(const DOMString& namespace_uri) const
1170{
1171 _checkValid();
1172 ARCANE_UNUSED(namespace_uri);
1173 TNIE;
1174 //return impl(m_p)->isDefaultNamespace(toChar(namespace_uri));
1175}
1176DOMString Node::
1177lookupNamespaceURI(const DOMString& prefix) const
1178{
1179 _checkValid();
1180 ARCANE_UNUSED(prefix);
1181 TNIE;
1182 //return fromChar(impl(m_p)->lookupNamespaceURI(toChar(prefix)));
1183}
1184DOMObject Node::
1185setUserData(const DOMString& key, const DOMObject& data,
1186 const UserDataHandler& handler) const
1187{
1188 _checkValid();
1189 ARCANE_UNUSED(key);
1190 ARCANE_UNUSED(data);
1191 ARCANE_UNUSED(handler);
1192 throw NotImplementedException(A_FUNCINFO);
1193}
1194DOMObject Node::
1195getUserData(const DOMString& key) const
1196{
1197 _checkValid();
1198 ARCANE_UNUSED(key);
1199 TNIE;
1200 //return impl(m_p)->getUserData(toChar(key));
1201}
1204{
1205 ::xmlNodePtr xnode = impl(m_p);
1206 if (xnode)
1207 ::xmlFreeNode(xnode);
1208}
1209bool operator==(const Node& n1, const Node& n2)
1210{
1211 return impl(n1.m_p) == impl(n2.m_p);
1212}
1213bool operator!=(const Node& n1, const Node& n2)
1214{
1215 return !operator==(n1, n2);
1216}
1217
1218/*---------------------------------------------------------------------------*/
1219/*---------------------------------------------------------------------------*/
1220
1221CharacterData::
1222CharacterData(CharacterDataPrv* v)
1223: Node(cvt((xmlNodePtr)impl(v)))
1224{}
1225
1226CharacterData::
1227CharacterData()
1228: Node()
1229{}
1230
1231CharacterData::
1232CharacterData(const CharacterData& node)
1233: Node(node)
1234{
1235}
1236
1237CharacterData::
1238CharacterData(const Node& node)
1239: Node()
1240{
1241 TNIE;
1242 ARCANE_UNUSED(node);
1243 //NodePrv* ni= node._impl();
1244 //if (ni && impl(ni)->getNodeType()==CDATA_SECTION_NODE)
1245 //_assign(node);
1246}
1247
1248CharacterDataPrv* CharacterData::
1249_impl() const
1250{
1251 TNIE;
1252 //return cvt((xmlCharacterDataPtr)impl(m_p));
1253}
1254
1255/*---------------------------------------------------------------------------*/
1256/*---------------------------------------------------------------------------*/
1257
1258Text::
1259Text(TextPrv* v)
1260: CharacterData(cvt((xmlCharacterDataPtr)impl(v)))
1261{}
1262Text::
1263Text()
1264: CharacterData()
1265{}
1266Text::
1267Text(const Text& node)
1268: CharacterData(node)
1269{
1270}
1271Text::
1272Text(const Node& node)
1273: CharacterData()
1274{
1275 TNIE;
1276 ARCANE_UNUSED(node);
1277 //NodePrv* ni= node._impl();
1278 //if (ni && impl(ni)->getNodeType()==TEXT_NODE)
1279 //_assign(node);
1280}
1281TextPrv* Text::
1282_impl() const
1283{
1284 return cvt((xmlTextPtr)impl(m_p));
1285}
1286
1287/*---------------------------------------------------------------------------*/
1288/*---------------------------------------------------------------------------*/
1289
1290/*---------------------------------------------------------------------------*/
1291/*---------------------------------------------------------------------------*/
1292
1293/*---------------------------------------------------------------------------*/
1294/*---------------------------------------------------------------------------*/
1295
1296/*---------------------------------------------------------------------------*/
1297/*---------------------------------------------------------------------------*/
1298
1299Document::
1300Document()
1301{}
1302Document::
1303Document(DocumentPrv* p)
1304: Node(cvt((xmlNodePtr)impl(p)))
1305{}
1306Document::
1307Document(const Node& node)
1308: Node()
1309{
1310 NodePrv* ni = node._impl();
1311 if (ni && impl(ni)->type == XML_DOCUMENT_NODE)
1312 _assign(node);
1313}
1314DocumentPrv* Document::
1315_impl() const
1316{
1317 return cvt((xmlDocPtr)impl(m_p));
1318}
1319DocumentType Document::
1320doctype() const
1321{
1322 _checkValid();
1323 TNIE;
1324 //return cvt(impl(_impl())->getDoctype());
1325}
1326DOMImplementation Document::
1327implementation() const
1328{
1329 _checkValid();
1330 TNIE;
1331 //return cvt(impl(_impl())->getImplementation());
1332}
1333Element Document::
1334documentElement() const
1335{
1336 _checkValid();
1337 xmlDocPtr xdoc = impl(_impl());
1338 xmlNodePtr xnode = ::xmlDocGetRootElement(xdoc);
1339 return cvt((xmlElementPtr)xnode);
1340}
1341Element Document::
1342createElement(const DOMString& name) const
1343{
1344 _checkValid();
1345 xmlDocPtr xdoc = impl(_impl());
1346 xmlNsPtr nspace = nullptr;
1347 xmlChar* content = nullptr;
1348 xmlNodePtr xnode = ::xmlNewDocNode(xdoc, nspace, toChar(name), content);
1349 return cvt((xmlElementPtr)xnode);
1350}
1351DocumentFragment Document::
1352createDocumentFragment() const
1353{
1354 _checkValid();
1355 TNIE;
1356 //return cvt(impl(_impl())->createDocumentFragment());
1357}
1358Text Document::
1359createTextNode(const DOMString& data) const
1360{
1361 _checkValid();
1362 xmlDocPtr xdoc = impl(_impl());
1363 return cvt((xmlTextPtr)::xmlNewDocText(xdoc, toChar(data)));
1364}
1365Comment Document::
1366createComment(const DOMString& data) const
1367{
1368 _checkValid();
1369 TNIE;
1370 ARCANE_UNUSED(data);
1371 //return cvt(impl(_impl())->createComment(toChar(data)));
1372}
1373CDATASection Document::
1374createCDATASection(const DOMString& data) const
1375{
1376 _checkValid();
1377 TNIE;
1378 ARCANE_UNUSED(data);
1379 //return cvt(impl(_impl())->createCDATASection(toChar(data)));
1380}
1381ProcessingInstruction Document::
1382createProcessingInstruction(const DOMString& target,
1383 const DOMString& data) const
1384{
1385 _checkValid();
1386 ARCANE_UNUSED(target);
1387 ARCANE_UNUSED(data);
1388 TNIE;
1389 // return cvt(impl(_impl())->createProcessingInstruction(toChar(target),toChar(data)));
1390}
1391
1392Attr Document::
1393createAttribute(const DOMString& name) const
1394{
1395 _checkValid();
1396 ARCANE_UNUSED(name);
1397 TNIE;
1398 //return cvt(impl(_impl())->createAttribute(toChar(name)));
1399}
1400
1401EntityReference Document::
1402createEntityReference(const DOMString& name) const
1403{
1404 _checkValid();
1405 ARCANE_UNUSED(name);
1406 TNIE;
1407 //return cvt(impl(_impl())->createEntityReference(toChar(name)));
1408}
1409NodeList Document::
1410getElementsByTagName(const DOMString& tagname) const
1411{
1412 _checkValid();
1413 ARCANE_UNUSED(tagname);
1414 TNIE;
1415 //return cvt(impl(_impl())->getElementsByTagName(toChar(tagname)));
1416}
1417Node Document::
1418importNode(const Node& imported_node, bool deep) const
1419{
1420 _checkValid();
1421 ARCANE_UNUSED(imported_node);
1422 ARCANE_UNUSED(deep);
1423 TNIE;
1424 //return cvt(impl(_impl())->importNode(impl(toNodePrv(imported_node)),deep));
1425}
1426Element Document::
1427createElementNS(const DOMString& namespace_uri, const DOMString& qualified_name) const
1428{
1429 _checkValid();
1430 ARCANE_UNUSED(namespace_uri);
1431 ARCANE_UNUSED(qualified_name);
1432 TNIE;
1433 //return cvt(impl(_impl())->createElementNS(toChar(namespace_uri),toChar(qualified_name)));
1434}
1435Attr Document::
1436createAttributeNS(const DOMString& namespace_uri, const DOMString& qualified_name) const
1437{
1438 _checkValid();
1439 ARCANE_UNUSED(namespace_uri);
1440 ARCANE_UNUSED(qualified_name);
1441 TNIE;
1442 //return cvt(impl(_impl())->createAttributeNS(toChar(namespace_uri),toChar(qualified_name)));
1443}
1444NodeList Document::
1445getElementsByTagNameNS(const DOMString& namespace_uri, const DOMString& local_name) const
1446{
1447 _checkValid();
1448 ARCANE_UNUSED(namespace_uri);
1449 ARCANE_UNUSED(local_name);
1450 TNIE;
1451 //return cvt(impl(_impl())->getElementsByTagNameNS(toChar(namespace_uri),toChar(local_name)));
1452}
1453Element Document::
1454getElementById(const DOMString& element_id) const
1455{
1456 _checkValid();
1457 TNIE;
1458 ARCANE_UNUSED(element_id);
1459 //return cvt(impl(_impl())->getElementById(toChar(element_id)));
1460}
1461DOMString Document::
1462actualEncoding() const
1463{
1464 _checkValid();
1465 TNIE;
1466 //throw NotImplementedException(A_FUNCINFO);
1467}
1468void Document::
1469actualEncoding(const DOMString& value) const
1470{
1471 _checkValid();
1472 ARCANE_UNUSED(value);
1473 throw NotImplementedException(A_FUNCINFO);
1474}
1475
1476DOMString Document::
1477encoding() const
1478{
1479 _checkValid();
1480 throw NotImplementedException(A_FUNCINFO);
1481}
1482
1483void Document::
1484encoding(const DOMString& value) const
1485{
1486 _checkValid();
1487 ARCANE_UNUSED(value);
1488 throw NotImplementedException(A_FUNCINFO);
1489}
1490
1491bool Document::
1492standalone() const
1493{
1494 _checkValid();
1495 throw NotImplementedException(A_FUNCINFO);
1496}
1497
1498void Document::
1499standalone(bool value) const
1500{
1501 _checkValid();
1502 ARCANE_UNUSED(value);
1503 throw NotImplementedException(A_FUNCINFO);
1504}
1505
1506bool Document::
1507strictErrorChecking() const
1508{
1509 _checkValid();
1510 TNIE;
1511 //return impl(_impl())->getStrictErrorChecking();
1512}
1513void Document::
1514strictErrorChecking(bool value) const
1515{
1516 _checkValid();
1517 ARCANE_UNUSED(value);
1518 TNIE;
1519 //impl(_impl())->setStrictErrorChecking(value);
1520}
1521void Document::
1522documentURI(const DOMString& document_uri) const
1523{
1524 _checkValid();
1525 ARCANE_UNUSED(document_uri);
1526 TNIE;
1527 //impl(_impl())->setDocumentURI(toChar(document_uri));
1528}
1529DOMString Document::
1530documentURI() const
1531{
1532 _checkValid();
1533 TNIE;
1534 //return fromChar(impl(_impl())->getDocumentURI());
1535}
1536
1537Node Document::
1538adoptNode(const Node& source) const
1539{
1540 _checkValid();
1541 TNIE;
1542 ARCANE_UNUSED(source);
1543 //return Node(cvt(impl(_impl())->adoptNode(impl(source._impl()))));
1544}
1545void Document::
1546normalizeDocument()
1547{
1548 _checkValid();
1549 TNIE;
1550 //impl(_impl())->normalizeDocument();
1551}
1552Node Document::
1553renameNode(const Node& node, const DOMString& namespace_uri,
1554 const DOMString& name)
1555{
1556 _checkValid();
1557 node._checkValid();
1558 ARCANE_UNUSED(node);
1559 ARCANE_UNUSED(namespace_uri);
1560 ARCANE_UNUSED(name);
1561 TNIE;
1562 //return Node(cvt(impl(_impl())->renameNode(impl(node._impl()),toChar(namespace_uri),toChar(name))));
1563}
1564
1565/*---------------------------------------------------------------------------*/
1566/*---------------------------------------------------------------------------*/
1567
1568DocumentFragment::
1569DocumentFragment()
1570: Node()
1571{}
1572DocumentFragment::
1573DocumentFragment(DocumentFragmentPrv* prv)
1574: Node(cvt((xmlNodePtr)impl(prv)))
1575{}
1576
1577/*---------------------------------------------------------------------------*/
1578/*---------------------------------------------------------------------------*/
1579
1580Comment::
1581Comment()
1582: CharacterData()
1583{}
1584Comment::
1585Comment(CommentPrv* prv)
1586: CharacterData((CharacterDataPrv*)prv)
1587{}
1588
1589/*---------------------------------------------------------------------------*/
1590/*---------------------------------------------------------------------------*/
1591
1592CDATASection::
1593CDATASection()
1594: Text()
1595{}
1596CDATASection::
1597CDATASection(CDATASectionPrv* prv)
1598: Text(cvt((xmlTextPtr)impl(prv)))
1599{}
1600
1601/*---------------------------------------------------------------------------*/
1602/*---------------------------------------------------------------------------*/
1603
1604EntityReference::
1605EntityReference()
1606: Node()
1607{}
1608EntityReference::
1609EntityReference(EntityReferencePrv* prv)
1610: Node(cvt((xmlNodePtr)impl(prv)))
1611{}
1612
1613/*---------------------------------------------------------------------------*/
1614/*---------------------------------------------------------------------------*/
1615
1616NodeList::
1617NodeList()
1618: m_p(0)
1619{}
1620NodeList::
1621NodeList(NodeListPrv* prv)
1622: m_p(prv)
1623{}
1624
1625void NodeList::
1626_checkValid() const
1627{
1628 if (!m_p)
1630}
1631Node NodeList::
1632item(ULong index) const
1633{
1634 _checkValid();
1635 ARCANE_UNUSED(index);
1636 TNIE;
1637 //return cvt(impl(m_p)->item(index));
1638}
1639ULong NodeList::
1640length() const
1641{
1642 _checkValid();
1643 TNIE;
1644 //return impl(m_p)->getLength();
1645}
1646
1647/*---------------------------------------------------------------------------*/
1648/*---------------------------------------------------------------------------*/
1649
1650DOMString CharacterData::
1651data() const
1652{
1653 _checkValid();
1654 TNIE;
1655 //return fromChar(impl(_impl())->getData());
1656}
1657void CharacterData::
1658data(const DOMString& value) const
1659{
1660 _checkValid();
1661 ARCANE_UNUSED(value);
1662 TNIE;
1663 //impl(_impl())->setData(toChar(value));
1664}
1665ULong CharacterData::
1666length() const
1667{
1668 _checkValid();
1669 TNIE;
1670 //return impl(_impl())->getLength();
1671}
1672DOMString CharacterData::
1673substringData(ULong offset, ULong count) const
1674{
1675 _checkValid();
1676 ARCANE_UNUSED(offset);
1677 ARCANE_UNUSED(count);
1678 TNIE;
1679 //return fromChar(impl(_impl())->substringData(offset,count));
1680}
1681void CharacterData::
1682appendData(const DOMString& arg) const
1683{
1684 _checkValid();
1685 ARCANE_UNUSED(arg);
1686 TNIE;
1687 //impl(_impl())->appendData(toChar(arg));
1688}
1689void CharacterData::
1690insertData(ULong offset, const DOMString& arg) const
1691{
1692 _checkValid();
1693 ARCANE_UNUSED(offset);
1694 ARCANE_UNUSED(arg);
1695 TNIE;
1696 //impl(_impl())->insertData(offset,toChar(arg));
1697}
1698void CharacterData::
1699deleteData(ULong offset, ULong count) const
1700{
1701 _checkValid();
1702 ARCANE_UNUSED(offset);
1703 ARCANE_UNUSED(count);
1704 TNIE;
1705 //impl(_impl())->deleteData(offset,count);
1706}
1707void CharacterData::
1708replaceData(ULong offset, ULong count, const DOMString& arg) const
1709{
1710 _checkValid();
1711 TNIE;
1712 ARCANE_UNUSED(offset);
1713 ARCANE_UNUSED(count);
1714 ARCANE_UNUSED(arg);
1715 //impl(_impl())->replaceData(offset,count,toChar(arg));
1716}
1717
1718/*---------------------------------------------------------------------------*/
1719/*---------------------------------------------------------------------------*/
1720
1721Attr::
1722Attr(AttrPrv* p)
1723: Node(cvt((xmlNodePtr)impl(p)))
1724{
1725}
1726
1727Attr::
1728Attr(const Node& node)
1729: Node()
1730{
1731 ARCANE_UNUSED(node);
1732 TNIE;
1733 // NodePrv* ni= node._impl();
1734 //if (ni && impl(ni)->getNodeType()==ATTRIBUTE_NODE)
1735 //_assign(node);
1736}
1737
1738AttrPrv* Attr::
1739_impl() const
1740{
1741 return cvt((xmlAttrPtr)impl(m_p));
1742}
1743DOMString Attr::
1744name() const
1745{
1746 _checkValid();
1747 TNIE;
1748 //return fromChar(impl(_impl())->getName());
1749}
1750bool Attr::
1751specified() const
1752{
1753 _checkValid();
1754 TNIE;
1755 //return impl(_impl())->getSpecified();
1756}
1757DOMString Attr::
1758value() const
1759{
1760 _checkValid();
1761 TNIE;
1762 //return fromChar(impl(_impl())->getValue());
1763}
1764void Attr::
1765value(const DOMString& str) const
1766{
1767 _checkValid();
1768 ARCANE_UNUSED(str);
1769 TNIE;
1770 //impl(_impl())->setValue(toChar(str));
1771}
1772Element Attr::
1773ownerElement() const
1774{
1775 _checkValid();
1776 TNIE;
1777 //return cvt(impl(_impl())->getOwnerElement());
1778}
1779
1780/*---------------------------------------------------------------------------*/
1781/*---------------------------------------------------------------------------*/
1782
1783Element::
1784Element()
1785: Node()
1786{}
1787Element::
1788Element(ElementPrv* p)
1789: Node(cvt((xmlNodePtr)impl(p)))
1790{}
1791Element::
1792Element(const Node& node)
1793: Node()
1794{
1795 NodePrv* ni = node._impl();
1796 if (ni && impl(ni)->type == XML_ELEMENT_NODE)
1797 _assign(node);
1798}
1799Element::
1800Element(const Element& node)
1801: Node(node)
1802{}
1803ElementPrv* Element::
1804_impl() const
1805{
1806 return cvt((xmlElementPtr)impl(m_p));
1807}
1808
1809DOMString Element::
1810tagName() const
1811{
1812 _checkValid();
1813 TNIE;
1814 // return fromChar(impl(_impl())->getTagName());
1815}
1816String Element::
1817getAttribute(const DOMString& name) const
1818{
1819 _checkValid();
1820 Attr a = getAttributeNode(name);
1821 if (a._null())
1822 return String();
1823 ::xmlChar* prop = ::xmlGetProp(impl(m_p), toChar(name));
1824 String s = fromChar(prop);
1825 ::xmlFree(prop);
1826 return s;
1827}
1828void Element::
1829setAttribute(const DOMString& name, const DOMString& value) const
1830{
1831 _checkValid();
1832 ::xmlSetProp(impl(m_p), toChar(name), toChar(value));
1833}
1834void Element::
1835removeAttribute(const DOMString& name) const
1836{
1837 _checkValid();
1838 ARCANE_UNUSED(name);
1839 TNIE;
1840 //impl(_impl())->removeAttribute(toChar(name));
1841}
1842Attr Element::
1843getAttributeNode(const DOMString& name) const
1844{
1845 _checkValid();
1846 xmlElementPtr elem_ptr = (xmlElementPtr)(impl(_impl()));
1847 return cvt(::xmlHasProp((xmlNodePtr)elem_ptr, toChar(name)));
1848}
1849Attr Element::
1850setAttributeNode(const Attr& new_attr) const
1851{
1852 _checkValid();
1853 ARCANE_UNUSED(new_attr);
1854 TNIE;
1855 //return cvt(impl(_impl())->setAttributeNode(impl(new_attr._impl())));
1856}
1857Attr Element::
1858removeAttributeNode(const Attr& old_attr) const
1859{
1860 _checkValid();
1861 ARCANE_UNUSED(old_attr);
1862 TNIE;
1863 //return cvt(impl(_impl())->removeAttributeNode(impl(old_attr._impl())));
1864}
1865NodeList Element::
1866getElementsByTagName(const DOMString& name) const
1867{
1868 _checkValid();
1869 ARCANE_UNUSED(name);
1870 TNIE;
1871 //return NodeList(cvt(impl(_impl())->getElementsByTagName(toChar(name))));
1872}
1873DOMString Element::
1874getAttributeNS(const DOMString& namespace_uri, const DOMString& local_name) const
1875{
1876 _checkValid();
1877 ARCANE_UNUSED(namespace_uri);
1878 ARCANE_UNUSED(local_name);
1879 TNIE;
1880 //return fromChar(impl(_impl())->getAttributeNS(toChar(namespace_uri),toChar(local_name)));
1881}
1882void Element::
1883setAttributeNS(const DOMString& namespace_uri, const DOMString& local_name,
1884 const DOMString& value) const
1885{
1886 _checkValid();
1887 ARCANE_UNUSED(namespace_uri);
1888 ARCANE_UNUSED(local_name);
1889 ARCANE_UNUSED(value);
1890 TNIE;
1891 //impl(_impl())->setAttributeNS(toChar(namespace_uri),toChar(local_name),toChar(value));
1892}
1893void Element::
1894removeAttributeNS(const DOMString& namespace_uri, const DOMString& local_name) const
1895{
1896 _checkValid();
1897 ARCANE_UNUSED(namespace_uri);
1898 ARCANE_UNUSED(local_name);
1899 TNIE;
1900 //impl(_impl())->removeAttributeNS(toChar(namespace_uri),toChar(local_name));
1901}
1902Attr Element::
1903getAttributeNodeNS(const DOMString& namespace_uri, const DOMString& local_name) const
1904{
1905 _checkValid();
1906 ARCANE_UNUSED(namespace_uri);
1907 ARCANE_UNUSED(local_name);
1908 TNIE;
1909 //return Attr(cvt(impl(_impl())->getAttributeNodeNS(toChar(namespace_uri),toChar(local_name))));
1910}
1911Attr Element::
1912setAttributeNodeNS(const Attr& new_attr) const
1913{
1914 _checkValid();
1915 new_attr._checkValid();
1916 TNIE;
1917 //return Attr(cvt(impl(_impl())->setAttributeNodeNS(impl(new_attr._impl()))));
1918}
1919NodeList Element::
1920getElementsByTagNameNS(const DOMString& namespace_uri, const DOMString& local_name) const
1921{
1922 _checkValid();
1923 ARCANE_UNUSED(namespace_uri);
1924 ARCANE_UNUSED(local_name);
1925 TNIE;
1926 //return NodeList(cvt(impl(_impl())->getElementsByTagNameNS(toChar(namespace_uri),toChar(local_name))));
1927}
1928bool Element::
1929hasAttribute(const DOMString& name) const
1930{
1931 _checkValid();
1932 ARCANE_UNUSED(name);
1933 TNIE;
1934 //return impl(_impl())->hasAttribute(toChar(name));
1935}
1936bool Element::
1937hasAttributeNS(const DOMString& namespace_uri, const DOMString& local_name) const
1938{
1939 _checkValid();
1940 ARCANE_UNUSED(namespace_uri);
1941 ARCANE_UNUSED(local_name);
1942 TNIE;
1943 //return impl(_impl())->hasAttributeNS(toChar(namespace_uri),toChar(local_name));
1944}
1945
1946/*---------------------------------------------------------------------------*/
1947/*---------------------------------------------------------------------------*/
1948
1949Text Text::
1950splitText(ULong offset) const
1951{
1952 _checkValid();
1953 ARCANE_UNUSED(offset);
1954 TNIE;
1955 //return Text(cvt(impl(_impl())->splitText(offset)));
1956}
1957DOMString Text::
1958wholeText() const
1959{
1960 _checkValid();
1961 TNIE;
1962 //return fromChar(impl(_impl())->getWholeText());
1963}
1964Text Text::
1965replaceWholeText(const DOMString& content) const
1966{
1967 _checkValid();
1968 ARCANE_UNUSED(content);
1969 TNIE;
1970 //return Text(cvt(impl(_impl())->replaceWholeText(toChar(content))));
1971}
1972
1973/*---------------------------------------------------------------------------*/
1974/*---------------------------------------------------------------------------*/
1975
1976DocumentType::
1977DocumentType()
1978: Node()
1979{}
1980DocumentType::
1981DocumentType(DocumentTypePrv* prv)
1982: Node(cvt((xmlNodePtr)impl(prv)))
1983{}
1984DocumentTypePrv* DocumentType::
1985_impl() const
1986{
1987 return cvt((xmlDocTypePtr)impl(m_p));
1988}
1989DOMString DocumentType::
1990name() const
1991{
1992 _checkValid();
1993 TNIE;
1994 //return fromChar(impl(_impl())->getName());
1995}
1996NamedNodeMap DocumentType::
1997entities() const
1998{
1999 _checkValid();
2000 TNIE;
2001 //return NamedNodeMap(cvt(impl(_impl())->getEntities()));
2002}
2003NamedNodeMap DocumentType::
2004notations() const
2005{
2006 _checkValid();
2007 TNIE;
2008 //return NamedNodeMap(cvt(impl(_impl())->getNotations()));
2009}
2010DOMString DocumentType::
2011publicId() const
2012{
2013 _checkValid();
2014 TNIE;
2015 //return fromChar(impl(_impl())->getPublicId());
2016}
2017DOMString DocumentType::
2018systemId() const
2019{
2020 _checkValid();
2021 TNIE;
2022 //return fromChar(impl(_impl())->getSystemId());
2023}
2024DOMString DocumentType::
2025internalSubset() const
2026{
2027 _checkValid();
2028 TNIE;
2029 //return fromChar(impl(_impl())->getInternalSubset());
2030}
2031
2032/*---------------------------------------------------------------------------*/
2033/*---------------------------------------------------------------------------*/
2034
2035NotationPrv* Notation::
2036_impl() const
2037{
2038 return cvt((xmlNotationPtr)impl(m_p));
2039}
2040
2041DOMString Notation::
2042publicId() const
2043{
2044 _checkValid();
2045 TNIE;
2046 //return fromChar(impl(_impl())->getPublicId());
2047}
2048
2049DOMString Notation::
2050systemId() const
2051{
2052 _checkValid();
2053 TNIE;
2054 //return fromChar(impl(_impl())->getSystemId());
2055}
2056
2057/*---------------------------------------------------------------------------*/
2058/*---------------------------------------------------------------------------*/
2059
2060EntityPrv* Entity::
2061_impl() const
2062{
2063 return cvt((xmlEntityPtr)impl(m_p));
2064}
2065
2066DOMString Entity::
2067publicId() const
2068{
2069 _checkValid();
2070 TNIE;
2071 //return fromChar(impl(_impl())->getPublicId());
2072}
2073DOMString Entity::
2074systemId() const
2075{
2076 _checkValid();
2077 TNIE;
2078 //return fromChar(impl(_impl())->getSystemId());
2079}
2080DOMString Entity::
2081notationName() const
2082{
2083 _checkValid();
2084 TNIE;
2085 //return fromChar(impl(_impl())->getNotationName());
2086}
2087
2088/*---------------------------------------------------------------------------*/
2089/*---------------------------------------------------------------------------*/
2090
2091ProcessingInstruction::
2092ProcessingInstruction()
2093: Node()
2094{}
2095ProcessingInstruction::
2096ProcessingInstruction(ProcessingInstructionPrv* prv)
2097: Node(cvt((xmlNodePtr)impl(prv)))
2098{}
2099ProcessingInstructionPrv* ProcessingInstruction::
2100_impl() const
2101{
2102 return cvt((xmlProcessingInstructionPtr)impl(m_p));
2103}
2104
2105DOMString ProcessingInstruction::
2106target() const
2107{
2108 _checkValid();
2109 TNIE;
2110 //return fromChar(impl(_impl())->getTarget());
2111}
2112DOMString ProcessingInstruction::
2113data() const
2114{
2115 _checkValid();
2116 TNIE;
2117 //return fromChar(impl(_impl())->getData());
2118}
2119void ProcessingInstruction::
2120data(const DOMString& value) const
2121{
2122 _checkValid();
2123 ARCANE_UNUSED(value);
2124 TNIE;
2125 //impl(_impl())->setData(toChar(value));
2126}
2127
2128/*---------------------------------------------------------------------------*/
2129/*---------------------------------------------------------------------------*/
2130
2131NamedNodeMap::
2132NamedNodeMap()
2133: m_p(nullptr)
2134{}
2135NamedNodeMap::
2136NamedNodeMap(NamedNodeMapPrv* p)
2137: m_p(p)
2138{}
2139NamedNodeMap::
2140NamedNodeMap(const NamedNodeMap& from)
2141: m_p(from.m_p)
2142{}
2143const NamedNodeMap& NamedNodeMap::
2144operator=(const NamedNodeMap& from)
2145{
2146 m_p = from.m_p;
2147 return (*this);
2148}
2149NamedNodeMap::
2150~NamedNodeMap()
2151{}
2152NamedNodeMapPrv* NamedNodeMap::
2153_impl() const
2154{
2155 return m_p;
2156}
2157bool NamedNodeMap::
2158_null() const
2159{
2160 return !m_p;
2161}
2162ULong NamedNodeMap::
2163length() const
2164{
2165 if (_null())
2166 return 0;
2167 ULong n = 0;
2168 ::xmlNodePtr xnode = (::xmlNodePtr)impl(m_p);
2169 while (xnode) {
2170 ++n;
2171 xnode = xnode->next;
2172 }
2173 return n;
2174}
2175Node NamedNodeMap::
2176getNamedItem(const DOMString& name) const
2177{
2178 // NOTE: Only works for attributes. For other types (entities, ...)
2179 // another version would have to be made. In principle, if we cast 'xmlAttr' to
2180 // 'xmlNode' and only use the basic fields (name, next), it should
2181 // work for everything.
2182 // NOTE: For attributes, the name can contain a namespace prefix (for
2183 // example xml:lang). Therefore, we must search via the prefix + local name
2184 // and not just the local name.
2185 if (_null())
2186 return Node();
2187 ::xmlAttrPtr xattrlist = (::xmlAttrPtr)impl(m_p);
2188 const ::xmlChar* aname = toChar(name);
2189 ::xmlAttrPtr current = xattrlist;
2190 while (current) {
2191 if (current->type == XML_ATTRIBUTE_NODE && current->ns) {
2192 std::string full_name = (const char*)(current->ns->prefix);
2193 full_name += ":";
2194 full_name += (const char*)(current->name);
2195 if (xmlStrEqual(aname, (const xmlChar*)full_name.c_str()) == 1) {
2196 return cvt((::xmlNodePtr)current);
2197 }
2198 }
2199 if (xmlStrEqual(aname, current->name) == 1) {
2200 return cvt((::xmlNodePtr)current);
2201 }
2202 current = current->next;
2203 }
2204 return Node();
2205}
2206Node NamedNodeMap::
2207setNamedItem(const Node& arg) const
2208{
2209 if (_null() || arg._null())
2210 return Node();
2211 TNIE;
2212 //return Node(cvt(impl(_impl())->setNamedItem(impl(arg._impl()))));
2213}
2214Node NamedNodeMap::
2215removeNamedItem(const DOMString& name) const
2216{
2217 if (_null())
2218 return Node();
2219 ARCANE_UNUSED(name);
2220 TNIE;
2221 //return Node(cvt(impl(_impl())->removeNamedItem(toChar(name))));
2222}
2223Node NamedNodeMap::
2224item(ULong index) const
2225{
2226 if (_null())
2227 return Node();
2228 ULong n = 0;
2229 ::xmlNodePtr xnode = (::xmlNodePtr)impl(m_p);
2230 while (xnode) {
2231 if (n == index)
2232 return Node(cvt(xnode));
2233 ++n;
2234 xnode = xnode->next;
2235 }
2236 return Node();
2237}
2238Node NamedNodeMap::
2239getNamedItemNS(const DOMString& namespace_uri, const DOMString& local_name) const
2240{
2241 if (_null())
2242 return Node();
2243 ARCANE_UNUSED(namespace_uri);
2244 ARCANE_UNUSED(local_name);
2245 TNIE;
2246 //return Node(cvt(impl(_impl())->getNamedItemNS(toChar(namespace_uri),toChar(local_name))));
2247}
2248Node NamedNodeMap::
2249setNamedItemNS(const Node& arg) const
2250{
2251 if (_null())
2252 return Node();
2253 if (arg._null())
2254 return Node();
2255 TNIE;
2256 //return Node(cvt(impl(_impl())->setNamedItemNS(impl(arg._impl()))));
2257}
2258Node NamedNodeMap::
2259removeNamedItemNS(const DOMString& namespace_uri, const DOMString& local_name) const
2260{
2261 if (_null())
2262 return Node();
2263 ARCANE_UNUSED(namespace_uri);
2264 ARCANE_UNUSED(local_name);
2265 TNIE;
2266 //return Node(cvt(impl(_impl())->removeNamedItemNS(toChar(namespace_uri),toChar(local_name))));
2267}
2268
2269/*---------------------------------------------------------------------------*/
2270/*---------------------------------------------------------------------------*/
2271
2272DOMImplementation DOMImplementationSource::
2273getDOMImplementation(const DOMString& features) const
2274{
2275 ARCANE_UNUSED(features);
2276 throw NotImplementedException(A_FUNCINFO);
2277}
2278
2279/*---------------------------------------------------------------------------*/
2280/*---------------------------------------------------------------------------*/
2281
2282void UserDataHandler::
2283handle(UShort operation, const DOMString& key, const DOMObject& data,
2284 const Node& src, const Node& dest) const
2285{
2286 ARCANE_UNUSED(operation);
2287 ARCANE_UNUSED(key);
2288 ARCANE_UNUSED(data);
2289 ARCANE_UNUSED(src);
2290 ARCANE_UNUSED(dest);
2291 throw NotImplementedException(A_FUNCINFO);
2292}
2293
2294/*---------------------------------------------------------------------------*/
2295/*---------------------------------------------------------------------------*/
2296
2297DOMWriter::
2298DOMWriter()
2299: m_p(0)
2300{}
2301DOMWriter::
2302DOMWriter(DOMWriterPrv* p)
2303: m_p(p)
2304{
2305}
2306DOMWriter::
2307DOMWriter(const DOMWriter& from)
2308: m_p(from.m_p)
2309{
2310}
2311const DOMWriter& DOMWriter::
2312operator=(const DOMWriter& from)
2313{
2314 m_p = from.m_p;
2315 return (*this);
2316}
2317DOMWriter::
2318~DOMWriter()
2319{}
2320bool DOMWriter::
2321_null() const
2322{
2323 return !m_p;
2324}
2325void DOMWriter::
2326_checkValid() const
2327{
2328 if (_null())
2330}
2331DOMWriterPrv* DOMWriter::
2332_impl() const
2333{
2334 return m_p;
2335}
2336
2337ByteUniqueArray DOMWriter::
2338writeNode(const Node& node) const
2339{
2340 ARCANE_UNUSED(node);
2341 throw NotImplementedException(A_FUNCINFO);
2342}
2343
2344void DOMWriter::
2345encoding(const String& encoding)
2346{
2347 _checkValid();
2348 ARCANE_UNUSED(encoding);
2349 throw NotImplementedException(A_FUNCINFO);
2350}
2351
2352String DOMWriter::
2353encoding() const
2354{
2355 _checkValid();
2356 throw NotImplementedException(A_FUNCINFO);
2357}
2358
2359/*---------------------------------------------------------------------------*/
2360/*---------------------------------------------------------------------------*/
2361
2362DOMError::
2363DOMError()
2364: m_p(0)
2365{}
2366DOMError::
2367DOMError(DOMErrorPrv* p)
2368: m_p(p)
2369{
2370}
2371DOMError::
2372DOMError(const DOMError& from)
2373: m_p(from.m_p)
2374{
2375}
2376const DOMError& DOMError::
2377operator=(const DOMError& from)
2378{
2379 m_p = from.m_p;
2380 return (*this);
2381}
2382DOMError::
2383~DOMError()
2384{}
2385bool DOMError::
2386_null() const
2387{
2388 return !m_p;
2389}
2390void DOMError::
2391_checkValid() const
2392{
2393 if (_null())
2395}
2396DOMErrorPrv* DOMError::
2397_impl() const
2398{
2399 return m_p;
2400}
2401
2402UShort DOMError::
2403severity() const
2404{
2405 _checkValid();
2406 TNIE;
2407 //return impl(_impl())->getSeverity();
2408}
2409DOMString DOMError::
2410message() const
2411{
2412 _checkValid();
2413 TNIE;
2414 //return fromChar(impl(_impl())->getMessage());
2415}
2416DOMObject DOMError::
2417relatedException() const
2418{
2419 _checkValid();
2420 TNIE;
2421 //return DOMObject(impl(_impl())->getRelatedException());
2422}
2423DOMLocator DOMError::
2424location() const
2425{
2426 _checkValid();
2427 TNIE;
2428 //return DOMLocator(cvt(impl(_impl())->getLocation()));
2429}
2430
2431/*---------------------------------------------------------------------------*/
2432/*---------------------------------------------------------------------------*/
2433
2434bool DOMErrorHandler::
2435handleError(const DOMError& error) const
2436{
2437 ARCANE_UNUSED(error);
2438 throw NotImplementedException(A_FUNCINFO);
2439}
2440
2441/*---------------------------------------------------------------------------*/
2442/*---------------------------------------------------------------------------*/
2443
2444DOMLocator::
2445DOMLocator()
2446: m_p(0)
2447{}
2448DOMLocator::
2449DOMLocator(DOMLocatorPrv* p)
2450: m_p(p)
2451{
2452}
2453DOMLocator::
2454DOMLocator(const DOMLocator& from)
2455: m_p(from.m_p)
2456{
2457}
2458const DOMLocator& DOMLocator::
2459operator=(const DOMLocator& from)
2460{
2461 m_p = from.m_p;
2462 return (*this);
2463}
2464DOMLocator::
2465~DOMLocator()
2466{}
2467bool DOMLocator::
2468_null() const
2469{
2470 return !m_p;
2471}
2472void DOMLocator::
2473_checkValid() const
2474{
2475 if (_null())
2477}
2478DOMLocatorPrv* DOMLocator::
2479_impl() const
2480{
2481 return m_p;
2482}
2483
2484long DOMLocator::
2485lineNumber() const
2486{
2487 _checkValid();
2488 TNIE;
2489 //return impl(_impl())->getLineNumber();
2490}
2491
2492long DOMLocator::
2493columnNumber() const
2494{
2495 _checkValid();
2496 TNIE;
2497 //return impl(_impl())->getColumnNumber();
2498}
2499
2500DOMString DOMLocator::
2501uri() const
2502{
2503 _checkValid();
2504 TNIE;
2505 //return fromChar(impl(_impl())->getURI());
2506}
2507
2508/*---------------------------------------------------------------------------*/
2509/*---------------------------------------------------------------------------*/
2510
2511/*---------------------------------------------------------------------------*/
2512/*---------------------------------------------------------------------------*/
2513
2514XPathExpression XPathEvaluator::
2515createExpression(const DOMString& expression,
2516 const XPathNSResolver& resolver) const
2517{
2518 ARCANE_UNUSED(expression);
2519 ARCANE_UNUSED(resolver);
2520 throw NotImplementedException(A_FUNCINFO);
2521}
2522XPathResult XPathEvaluator::
2523createResult() const
2524{
2525 throw NotImplementedException(A_FUNCINFO);
2526}
2527XPathNSResolver XPathEvaluator::
2528createNSResolver(const Node& node_resolver) const
2529{
2530 ARCANE_UNUSED(node_resolver);
2531 throw NotImplementedException(A_FUNCINFO);
2532}
2533XPathResult XPathEvaluator::
2534evaluate(const DOMString& expression, const Node& context_node,
2535 const XPathNSResolver& resolver, UShort type,
2536 const XPathResult& result) const
2537{
2538 ARCANE_UNUSED(expression);
2539 ARCANE_UNUSED(context_node);
2540 ARCANE_UNUSED(resolver);
2541 ARCANE_UNUSED(type);
2542 ARCANE_UNUSED(result);
2543 throw NotImplementedException(A_FUNCINFO);
2544}
2545XPathResult XPathEvaluator::
2546evaluateExpression(const XPathExpression& expression,
2547 const Node& context_node, UShort type,
2548 const XPathResult& result) const
2549{
2550 ARCANE_UNUSED(expression);
2551 ARCANE_UNUSED(context_node);
2552 ARCANE_UNUSED(type);
2553 ARCANE_UNUSED(result);
2554 throw NotImplementedException(A_FUNCINFO);
2555}
2556
2557/*---------------------------------------------------------------------------*/
2558/*---------------------------------------------------------------------------*/
2559
2560DOMString XPathNSResolver::
2561lookupNamespaceURI(const DOMString& prefix) const
2562{
2563 ARCANE_UNUSED(prefix);
2564 throw NotImplementedException(A_FUNCINFO);
2565}
2566
2567/*---------------------------------------------------------------------------*/
2568/*---------------------------------------------------------------------------*/
2569
2570UShort XPathResult::
2571resultType() const
2572{
2573 throw NotImplementedException(A_FUNCINFO);
2574}
2575double XPathResult::
2576numberValue() const
2577{
2578 throw NotImplementedException(A_FUNCINFO);
2579}
2580DOMString XPathResult::
2581stringValue() const
2582{
2583 throw NotImplementedException(A_FUNCINFO);
2584}
2585bool XPathResult::
2586booleanValue() const
2587{
2588 throw NotImplementedException(A_FUNCINFO);
2589}
2590Node XPathResult::
2591singleNodeValue() const
2592{
2593 throw NotImplementedException(A_FUNCINFO);
2594}
2595XPathSetIterator XPathResult::
2596getSetIterator(bool ordered) const
2597{
2598 ARCANE_UNUSED(ordered);
2599 throw NotImplementedException(A_FUNCINFO);
2600}
2601XPathSetSnapshot XPathResult::
2602getSetSnapshot(bool ordered) const
2603{
2604 ARCANE_UNUSED(ordered);
2605 throw NotImplementedException(A_FUNCINFO);
2606}
2607
2608/*---------------------------------------------------------------------------*/
2609/*---------------------------------------------------------------------------*/
2610
2611Node XPathSetIterator::
2612nextNode() const
2613{
2614 throw NotImplementedException(A_FUNCINFO);
2615}
2616
2617/*---------------------------------------------------------------------------*/
2618/*---------------------------------------------------------------------------*/
2619
2620ULong XPathSetSnapshot::
2621length() const
2622{
2623 throw NotImplementedException(A_FUNCINFO);
2624}
2625Node XPathSetSnapshot::
2626item(ULong index) const
2627{
2628 ARCANE_UNUSED(index);
2629 throw NotImplementedException(A_FUNCINFO);
2630}
2631
2632/*---------------------------------------------------------------------------*/
2633/*---------------------------------------------------------------------------*/
2634
2635Element XPathNamespace::
2636ownerElement() const
2637{
2638 throw NotImplementedException(A_FUNCINFO);
2639}
2640
2641/*---------------------------------------------------------------------------*/
2642/*---------------------------------------------------------------------------*/
2643
2644void DOMImplementation::
2645initialize()
2646{
2647 // Explicitly calls xmlInitParser(). This is not theoretically
2648 // indispensable, but this method can generate floating point exceptions
2649 // because at one point there is an explicit call to a division by zero to
2650 // generate a Nan (in xmlXPathInit()). Since DOMImplementation::initialize()
2651 // is called before enabling floating point exceptions, the call to parser
2652 // initialization must be made explicitly here.
2653 ::xmlInitParser();
2654}
2655
2656/*---------------------------------------------------------------------------*/
2657/*---------------------------------------------------------------------------*/
2658
2659void DOMImplementation::
2660terminate()
2661{
2662 // Again, this is not indispensable, but it allows global resources to be freed
2663 // and thus avoids potential memory leaks (which bothers tools like valgrind).
2664 ::xmlCleanupParser();
2665}
2666
2667/*---------------------------------------------------------------------------*/
2668/*---------------------------------------------------------------------------*/
2669
2670} // namespace Arcane::dom
2671
2672/*---------------------------------------------------------------------------*/
2673/*---------------------------------------------------------------------------*/
#define ARCANE_THROW(exception_class,...)
Macro for throwing an exception with formatting.
constexpr const_pointer data() const noexcept
Pointer to the allocated memory.
constexpr Integer size() const noexcept
Number of elements in the array.
constexpr bool empty() const noexcept
true if the array is empty (size()==0)
Manager of a DOM document.
Node of a mesh.
Definition Item.h:598
Node()=default
Creation of a node not connected to the mesh.
Unicode character string constructor.
String toString() const
Returns the constructed character string.
bool null() const
Returns true if the string is null.
Definition String.cc:306
const char * localstr() const
Returns the conversion of the instance into UTF-8 encoding.
Definition String.cc:229
XML file related exceptions.
Node of a DOM tree.
Definition XmlNode.h:51
Document createDocument(const DOMString &namespace_uri, const DOMString &qualified_name, const DocumentType &doctype) const
IXmlDocumentHolder * _load(const String &fname, ITraceMng *msg, const String &schemaname)
IXmlDocumentHolder * _newDocument()
The following methods are internal to Arcane.
Handling of XML reader errors.
static void XMLCDECL handler(void *user_data, T *e)
Handler to connect to libxml2.
Class encapsulating the XML document parser.
IXmlDocumentHolder * parse(ILibXml2_Reader *reader, const String &schema_name, ByteConstArrayView schema_data)
Parses the XML content via the reader reader.
Class encapsulating XML Schema validation of an XML document.
void validate(::xmlDocPtr doc, ByteConstArrayView schema_data)
Validates an XML document.
NodePrv * m_p
Class implementation.
Definition Dom.h:430
void releaseNode()
Destroys the node.
IXmlDocumentHolder * clone() override
Clones this document.
XmlNode documentNode() override
Document node. This node is null if the document does not exist.
String save() override
Saves this document and returns the string.
void save(ByteArray &bytes) override
Saves this document into the array bytes.
GenericDocument< UTF8<> > Document
GenericDocument with UTF8 encoding.
Definition document.h:2891
Integer len(const char *s)
Returns the length of the string s.
Integer arcaneCheckArraySize(unsigned long long size)
Checks that size can be converted into an 'Integer' to serve as the size of an array....
void arcaneNullPointerError()
Signals the use of a null pointer.
Int32 Integer
Type representing an integer.
Array< Byte > ByteArray
Dynamic one-dimensional array of characters.
Definition UtilsTypes.h:115
UniqueArray< Byte > ByteUniqueArray
Dynamic 1D array of characters.
Definition UtilsTypes.h:329
Span< const std::byte > ByteConstSpan
Read-only view of a 1D array of characters.
Definition UtilsTypes.h:542
ConstArrayView< Byte > ByteConstArrayView
C equivalent of a 1D array of characters.
Definition UtilsTypes.h:470
unsigned char Byte
Type of a byte.
Definition BaseTypes.h:42