14#include "arcane/utils/ArcanePrecomp.h"
16#include "arcane/utils/Array.h"
17#include "arcane/utils/Iostream.h"
18#include "arcane/utils/Iterator.h"
19#include "arcane/utils/StdHeader.h"
20#include "arcane/utils/String.h"
21#include "arcane/utils/StringBuilder.h"
22#include "arcane/utils/NotImplementedException.h"
23#include "arcane/utils/FatalErrorException.h"
25#include "arcane/core/Dom.h"
26#include "arcane/core/DomUtils.h"
27#include "arcane/core/XmlNode.h"
28#include "arcane/core/IXmlDocumentHolder.h"
41 extern "C++" ARCANE_CORE_EXPORT
void
42 removeAllChildren(
const dom::Node& parent);
44 extern "C++" ARCANE_CORE_EXPORT
bool
45 writeNode(std::ostream& ostr,
const dom::Node&);
47 extern "C++" ARCANE_CORE_EXPORT
bool
48 writeNodeChildren(std::ostream& ostr,
const dom::Node&);
61 void _notImplemented(
const char* reason)
63 cerr <<
"* DOMUTILS NOT YET IMPLEMENTED: " << reason <<
'\n';
70 void _writeNodeChildren(std::ostream& o,
const dom::Node& node)
74 while (!next._null()) {
75 domutils::writeNode(o, next);
76 next = next.nextSibling();
93 if (node.nodeType() != Node::ELEMENT_NODE)
95 for (
Node i = node.firstChild(); !i._null(); i = i.nextSibling()) {
96 UShort ntype = i.nodeType();
97 if (ntype == Node::TEXT_NODE)
99 else if (ntype == Node::CDATA_SECTION_NODE) {
100 str += i.nodeValue();
102 else if (ntype == Node::ENTITY_REFERENCE_NODE) {
106 return str.toString();
119 if (node.nodeType() != Node::ELEMENT_NODE)
121 removeAllChildren(node);
122 if (!new_value.null()) {
123 Text text_node = node.ownerDocument().createTextNode(new_value);
124 node.appendChild(text_node);
134 return domutils::textContent(node);
143 textContent(node, new_value);
158 textContent(elem, value);
159 parent.appendChild(elem);
177 const dom::Node& n = attr.getNamedItem(attr_name);
186 String str2 = element.getAttribute(attr_name);
188 ARCANE_FATAL(
"Bad new value for attribute '{0}' new={1} current={2}",attr_name,str2,str);
203 elem.setAttribute(name, value);
212 dom::DOMString ref_name(child_name);
213 for (
dom::Node i = parent.firstChild(); !i._null(); i = i.nextSibling()) {
214 if (i.nodeName() == ref_name)
224removeAllChildren(
const dom::Node& parent)
232 parent.removeChild(n);
234 n = parent.firstChild();
251 const char* expr = xpath_expr.localstr();
252 if (context_node._null()) {
258 const char* separator = ::strchr(expr,
'/');
262 std::string_view buf1(expr, (
Int64)(separator - expr));
264 dom::Node child = childNode(context_node, buf);
268 return nodeFromXPath(child,
String(std::string_view(separator + 1)));
270 return childNode(context_node, xpath_expr);
277writeNodeChildren(std::ostream& ostr,
const dom::Node& node)
279 _writeNodeChildren(ostr, node);
287writeNode(std::ostream& o,
const dom::Node& node)
290 switch (node.nodeType()) {
291 case Node::ELEMENT_NODE: {
292 o <<
'<' << node.nodeName();
293 NamedNodeMap attr_list = node.attributes();
294 for (ULong i = 0, s = attr_list.length(); i < s; ++i) {
296 writeNode(o, attr_list.item(i));
299 writeNodeChildren(o, node);
300 o <<
"</" << node.nodeName() <<
'>';
302 case Node::ATTRIBUTE_NODE:
303 o << node.nodeName() <<
'='
304 <<
'"' << node.nodeValue() <<
'"';
306 case Node::TEXT_NODE:
307 o << node.nodeValue();
310 case Node::CDATA_SECTION_NODE:
311 o << node.nodeValue();
312 cerr <<
"** Dom::writeNode() for CDATA_SECTION_NODE Not fully implemented\n";
315 case Node::ENTITY_REFERENCE_NODE:
316 _notImplemented(
"Dom::writeNode() for ENTITY_REFERENCE_NODE");
318 case Node::ENTITY_NODE:
319 _notImplemented(
"Dom::writeNode() for ENTITY_NODE");
321 case Node::PROCESSING_INSTRUCTION_NODE:
322 _notImplemented(
"Dom::writeNode() for PROCESSING_INSTRUCTION_NODE");
324 case Node::COMMENT_NODE:
325 o <<
"<!--" << node.nodeValue() <<
"-->";
327 case Node::DOCUMENT_NODE:
328 _writeNodeChildren(o, node);
330 case Node::DOCUMENT_TYPE_NODE:
331 _writeNodeChildren(o, node);
333 case Node::DOCUMENT_FRAGMENT_NODE:
334 _notImplemented(
"Dom::writeNode() for DOCUMENT_FRAGMENT_NODE");
336 case Node::NOTATION_NODE:
337 _notImplemented(
"Dom::writeNode() for NOTATION_NODE");
340 _notImplemented(
"Dom::writeNode() for unknown node");
350saveDocument(std::ostream& ostr,
const dom::Document& doc,
int indent_level)
353 saveDocument(bytes, doc, indent_level);
354 ostr.write((
const char*)bytes.data(), bytes.size());
365 domimp._save(bytes, doc, indent_level);
366 Integer nb_byte = bytes.size();
367 if (nb_byte >= 1 && bytes[nb_byte - 1] ==
'\0') {
368 ARCANE_FATAL(
"Invalid null charactere at end of XML stream");
389domutils::NameIterator::
393, m_ref_name(ref_name)
395 _findNextValid(
true);
401void domutils::NameIterator::
402_findNextValid(
bool is_init)
405 m_current = m_parent.firstChild();
407 if (m_current._null())
409 m_current = m_current.nextSibling();
411 while (!m_current._null()) {
412 if (m_current.nodeName() == m_ref_name)
414 m_current = m_current.nextSibling();
437 return domimp.
_load(buffer, name, tm);
456 return domimp.
_load(filename, tm, schema_filename);
#define ARCANE_THROW(exception_class,...)
Macro for throwing an exception with formatting.
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Manager of a DOM document.
static IXmlDocumentHolder * loadFromFile(const String &filename, ITraceMng *tm)
Loads an XML document.
View of an array of elements of type T.
Unicode character string constructor.
String toString() const
Returns the constructed character string.
Unicode character string.
IXmlDocumentHolder * _load(const String &fname, ITraceMng *msg, const String &schemaname)
IXmlDocumentHolder * _newDocument()
The following methods are internal to Arcane.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int64_t Int64
Signed integer type of 64 bits.
Int32 Integer
Type representing an integer.
Array< Byte > ByteArray
Dynamic one-dimensional array of characters.
UniqueArray< Byte > ByteUniqueArray
Dynamic 1D array of characters.
Span< const std::byte > ByteConstSpan
Read-only view of a 1D array of characters.
Impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converts the view into an array of non-modifiable bytes.