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