mbxmlutils  1.3.0
Multi-Body XML Utils
dom.h
1#ifndef _MBXMLUTILSHELPER_DOM_H_
2#define _MBXMLUTILSHELPER_DOM_H_
3
4#include <fmatvec/atom.h>
5#include <string>
6#include <utility>
7#include <vector>
8#include <map>
9#include <set>
10#include <variant>
11#include <boost/filesystem.hpp>
12#include <xercesc/dom/DOMErrorHandler.hpp>
13#include <xercesc/dom/DOMElement.hpp>
14#include <xercesc/dom/DOMText.hpp>
15#include <xercesc/dom/DOMLSParser.hpp>
16#include <xercesc/dom/DOMLocator.hpp>
17#include <xercesc/dom/DOMUserDataHandler.hpp>
18#include <xercesc/dom/DOMDocument.hpp>
19#include <xercesc/util/TransService.hpp>
20#include <xercesc/util/XMLEntityResolver.hpp>
21#include <xercesc/framework/psvi/PSVIHandler.hpp>
22#include <boost/lexical_cast.hpp>
23#include <boost/container/small_vector.hpp>
24#include <fmatvec/toString.h>
25
26namespace XERCES_CPP_NAMESPACE {
27 class DOMProcessingInstruction;
28 class DOMImplementation;
29 class AbstractDOMParser;
30}
31
32namespace boost {
33 template<> std::vector<double> lexical_cast(const std::string& str);
34 template<> std::vector<std::vector<double>> lexical_cast(const std::string& str);
35 template<> std::vector<int> lexical_cast(const std::string& str);
36 template<> std::vector<std::vector<int>> lexical_cast(const std::string& str);
37 template<> bool lexical_cast<bool>(const std::string& arg);
38}
39
40namespace {
41
42template<class T>
43struct CheckSize {
44 static void check(const xercesc::DOMElement *me, const T &value, int r, int c);
45};
46template<class T>
47struct CheckSize<std::vector<T>> {
48 static void check(const xercesc::DOMElement *me, const std::vector<T> &value, int r, int c);
49};
50template<class T>
51struct CheckSize<std::vector<std::vector<T>>> {
52 static void check(const xercesc::DOMElement *me, const std::vector<std::vector<T>> &value, int r, int c);
53};
54
55}
56
57namespace MBXMLUtils {
58
59template<class T> struct XercesUniquePtrDeleter { void operator()(T *n) { if(n) n->release(); } };
61template<class T> using XercesUniquePtr = std::unique_ptr<T, XercesUniquePtrDeleter<T>>;
62
63// forward declaration
64template<typename DOMDocumentType>
66template<typename DOMDocumentType>
67DOMDocumentWrapper<DOMDocumentType> D(DOMDocumentType *me);
68template<typename DOMElementType>
70template<typename DOMElementType>
71DOMElementWrapper<DOMElementType> E(DOMElementType *me);
72
75 public:
76 InitXerces() {
77 xercesc::XMLPlatformUtils::Initialize();
78 }
79 ~InitXerces() {
80 xercesc::XMLPlatformUtils::Terminate();
81 }
82};
83
86class X {
87 public:
88 const XMLCh *operator%(const std::string &str) {
89 if(str.empty())
90 return &xercesc::chNull;
91 const XMLCh *unicode=xercesc::TranscodeFromStr(reinterpret_cast<const XMLByte*>(str.c_str()), str.length(), "UTF8").adopt();
92 store.emplace_back(unicode, &releaseXMLCh);
93 return unicode;
94 }
95 const XMLCh *operator()(const std::string &str) { return operator%(str); }
96 std::string operator%(const XMLCh *unicode) {
97 if(!unicode || unicode[0]==0)
98 return {};
99 return reinterpret_cast<const char*>(xercesc::TranscodeToStr(unicode, "UTF8").str());
100 }
101 std::string operator()(const XMLCh *unicode) { return operator%(unicode); }
102 static void releaseXMLCh(const XMLCh *s) { xercesc::XMLPlatformUtils::fgMemoryManager->deallocate(const_cast<XMLCh*>(s)); }
103 private:
104 boost::container::small_vector<std::unique_ptr<const XMLCh, decltype(&releaseXMLCh)>, 1> store;
105};
106
109class FQN : public std::pair<std::string, std::string> {
110 public:
112 FQN() = default;
114 FQN(const std::string &name) : std::pair<std::string, std::string>("", name) {}
116 FQN(const char *name) : std::pair<std::string, std::string>("", name) {}
118 FQN(const std::string &ns, const std::string &name) : std::pair<std::string, std::string>(ns, name) {}
119};
120
123class EmbedDOMLocator : public xercesc::DOMLocator {
124 public:
125 EmbedDOMLocator(const boost::filesystem::path &file_, int row_, int embedCount_, std::string xpath_) : DOMLocator(),
126 file(x%file_.string()), row(row_), embedCount(embedCount_), xpath(std::move(xpath_)) {}
127 EmbedDOMLocator(const EmbedDOMLocator &src) : DOMLocator(),
128 file(x%(X()%src.file)), row(src.row), embedCount(src.embedCount), xpath(src.xpath) {}
129 EmbedDOMLocator& operator=(const EmbedDOMLocator &src) {
130 file=x%(X()%src.file);
131 row=src.row;
132 embedCount=src.embedCount;
133 xpath=src.xpath;
134 return *this;
135 }
136 ~EmbedDOMLocator() override = default;
137 EmbedDOMLocator(const EmbedDOMLocator &&src) = delete;
138 EmbedDOMLocator& operator=(const EmbedDOMLocator &&src) = delete;
139 XMLFileLoc getLineNumber() const override { return row; }
140 XMLFileLoc getColumnNumber() const override { return 0; }
141 XMLFilePos getByteOffset() const override { return ~(XMLFilePos(0)); }
142 XMLFilePos getUtf16Offset() const override { return ~(XMLFilePos(0)); }
143 xercesc::DOMNode *getRelatedNode() const override { return nullptr; }
144 const XMLCh *getURI() const override { return file; }
145 int getEmbedCount() const { return embedCount; }
147 const std::string& getRootXPathExpression() const { return xpath; }
149 std::string getRootHRXPathExpression() const;
150 static void addNSURIPrefix(std::string nsuri, const std::vector<std::string> &prefix);
151 static const std::map<std::string, std::string>& getNSURIPrefix() { return nsURIPrefix(); }
152 private:
153 X x;
154 const XMLCh *file;
155 int row;
156 int embedCount;
157 std::string xpath;
158 static std::map<std::string, std::string>& nsURIPrefix();
159};
160
163 public:
164 NamespaceURI(std::string nsuri_, const std::vector<std::string> &preferredPrefix={}) : nsuri(std::move(nsuri_)) {
165 EmbedDOMLocator::addNSURIPrefix(nsuri, preferredPrefix);
166 }
167 FQN operator%(const std::string &localName) const { return {nsuri, localName}; }
168 const std::string& getNamespaceURI() const { return nsuri; }
169 private:
170 std::string nsuri;
171};
172
174const NamespaceURI XINCLUDE("http://www.w3.org/2001/XInclude", {"xi", "xinc", "xinclude"});
176const NamespaceURI XMLNS("http://www.w3.org/2000/xmlns/", {"xmlns"});
178const NamespaceURI PV("http://www.mbsim-env.de/MBXMLUtils", {"p", "pv", "mbxmlutils"});
180const NamespaceURI XMLCATALOG("urn:oasis:names:tc:entity:xmlns:xml:catalog", {"catalog", "xmlcatalog"});
181
182// Exception wrapping for DOMEvalException.
183// Rethrow a exception as DOMEvalException with context e, a DOMEvalException is just rethrown unchanged.
184#define RETHROW_AS_DOMEVALEXCEPTION(e) \
185 catch(MBXMLUtils::DOMEvalException &ex) { \
186 throw ex; \
187 } \
188 catch(const std::exception &ex) { \
189 throw DOMEvalException(ex.what(), e); \
190 }
191
194class DOMEvalException : public std::exception {
195 friend class DOMParser;
196 friend class DOMErrorPrinter;
197 public:
198 DOMEvalException() = default;
199 DOMEvalException(const std::string &errorMsg_, const xercesc::DOMNode *n);
200 void appendContext(const xercesc::DOMNode *n, int lineNr=0);
201 const std::string& getMessage() const { return errorMsg; }
202 void setMessage(const std::string& errorMsg_) { errorMsg=errorMsg_; }
203 void setSubsequentError(bool sse) { subsequentError=sse; }
204 const char* what() const noexcept override;
205 xercesc::DOMNode::NodeType getNodeType() const { return nodeType; }
206 static bool isHTMLOutputEnabled();
207 static void htmlEscaping(std::string &msg);
208 protected:
209 DOMEvalException(const std::string &errorMsg_, const xercesc::DOMLocator &loc);
210 private:
237 static std::string convertToString(const EmbedDOMLocator &loc, const std::string &message, bool subsequentError=false);
238
239 bool subsequentError{false};
240 std::string errorMsg;
241 std::vector<EmbedDOMLocator> locationStack;
242 mutable std::string whatStr;
243 xercesc::DOMNode::NodeType nodeType { static_cast<xercesc::DOMNode::NodeType>(-1) };
244};
245
247class DOMErrorPrinter: public xercesc::DOMErrorHandler, virtual public fmatvec::Atom
248{
249 public:
250 DOMErrorPrinter() = default;
251 bool handleError(const xercesc::DOMError&) override;
252 bool hasError() { return errorSet; }
253 const DOMEvalException& getError() { return error; }
254 void resetError() { errorSet=false; }
255 private:
256 bool errorSet{false};
257 DOMEvalException error;
258};
259
261template<typename DOMElementType>
263 public:
265 DOMElementWrapper(DOMElementType *me_) : me(me_) {}
267 FQN getTagName() const { return FQN(X()%me->getNamespaceURI(), X()%me->getLocalName()); }
269 const xercesc::DOMElement *getFirstElementChildNamed(const FQN &name) const;
271 xercesc::DOMElement *getFirstElementChildNamed(const FQN &name);
273 const xercesc::DOMElement *getNextElementSiblingNamed(const FQN &name) const;
275 xercesc::DOMElement *getNextElementSiblingNamed(const FQN &name);
277 const xercesc::DOMProcessingInstruction *getFirstProcessingInstructionChildNamed(const std::string &target) const;
279 xercesc::DOMProcessingInstruction *getFirstProcessingInstructionChildNamed(const std::string &target);
281 void addProcessingInstructionChildNamed(const std::string &target, const std::string &data);
283 std::string getEmbedData(const std::string &name) const;
286 void addEmbedData(const std::string &name, const std::string &data);
288 const xercesc::DOMComment *getFirstCommentChild() const;
290 xercesc::DOMComment *getFirstCommentChild();
295 const xercesc::DOMText *getFirstTextChild() const;
300 xercesc::DOMText *getFirstTextChild();
302 template<class T> T getText(int r=0, int c=0) const {
303 try {
304 auto textEle=E(me)->getFirstTextChild();
305 auto text=textEle ? X()%textEle->getData() : "";
306 auto ret=boost::lexical_cast<T>(text);
307 CheckSize<T>::check(me, ret, r, c);
308 return ret;
309 }
310 catch(const boost::bad_lexical_cast &ex) {
311 throw DOMEvalException(ex.what(), me);
312 }
313 catch(const std::exception &ex) {
314 throw DOMEvalException(ex.what(), me);
315 }
316 }
317
318 template<class T> void addElementText(const FQN &name, const T &value) {
319 xercesc::DOMElement *ele=D(me->getOwnerDocument())->createElement(name);
320 ele->insertBefore(me->getOwnerDocument()->createTextNode(MBXMLUtils::X()%fmatvec::toString(value)), nullptr);
321 me->insertBefore(ele, nullptr);
322 }
325 bool isDerivedFrom(const FQN &baseTypeName) const;
331 boost::filesystem::path getOriginalFilename(bool skipThis=false,
332 const xercesc::DOMElement *&found=DOMElementWrapper<DOMElementType>::dummyArg) const;
337 void setOriginalFilename(boost::filesystem::path orgFileName=boost::filesystem::path());
340 boost::filesystem::path convertPath(const boost::filesystem::path &relPath) const;
343 int getLineNumber() const;
346 int getEmbedCountNumber() const;
349 void setEmbedCountNumber(int embedCount);
352 int getEmbedXPathCount() const;
355 void setEmbedXPathCount(int xPathCount);
360 std::string getRootXPathExpression() const;
363 std::vector<int> getElementLocation() const;
367 void setOriginalElementLineNumber(int lineNr);
369 std::string getAttribute(const FQN &name) const;
371 FQN getAttributeQName(const FQN &name) const;
373 const xercesc::DOMAttr* getAttributeNode(const FQN &name) const;
375 xercesc::DOMAttr* getAttributeNode(const FQN &name);
377 template<class T>
378 void setAttribute(const FQN &name, const T &value) {
379 me->setAttributeNS(X()%name.first, X()%name.second, X()%fmatvec::toString(value));
380 }
382 void setAttribute(const FQN &name, const FQN &value);
384 bool hasAttribute(const FQN &name) const;
386 void removeAttribute(const FQN &name);
388 typename std::conditional<std::is_same<DOMElementType, const xercesc::DOMElement>::value,
390 return this;
391 }
392 static const xercesc::DOMElement *dummyArg;
393 private:
394 DOMElementType *me;
395};
397template<typename DOMElementType>
398DOMElementWrapper<DOMElementType> E(DOMElementType *me) { return DOMElementWrapper<DOMElementType>(me); }
400template<typename DOMElementType>
401DOMElementWrapper<DOMElementType> E(const std::shared_ptr<DOMElementType> &me) { return DOMElementWrapper<DOMElementType>(me.get()); }
403template<typename DOMElementType>
404DOMElementWrapper<DOMElementType> E(const XercesUniquePtr<DOMElementType> &me) { return DOMElementWrapper<DOMElementType>(me.get()); }
405
406template<> const xercesc::DOMElement *DOMElementWrapper< xercesc::DOMElement>::dummyArg;
407template<> const xercesc::DOMElement *DOMElementWrapper<const xercesc::DOMElement>::dummyArg;
408
410template<typename DOMAttrType>
412 public:
414 DOMAttrWrapper(DOMAttrType *me_) : me(me_) {}
417 bool isDerivedFrom(const FQN &baseTypeName) const;
420 std::string getRootXPathExpression() const;
422 typename std::conditional<std::is_same<DOMAttrType, const xercesc::DOMAttr>::value,
424 return this;
425 }
426 private:
427 DOMAttrType *me;
428};
430template<typename DOMAttrType>
431DOMAttrWrapper<DOMAttrType> A(DOMAttrType *me) { return DOMAttrWrapper<DOMAttrType>(me); }
433template<typename DOMAttrType>
434DOMAttrWrapper<DOMAttrType> A(const std::shared_ptr<DOMAttrType> &me) { return DOMAttrWrapper<DOMAttrType>(me.get()); }
436template<typename DOMAttrType>
437DOMAttrWrapper<DOMAttrType> A(const XercesUniquePtr<DOMAttrType> &me) { return DOMAttrWrapper<DOMAttrType>(me.get()); }
438
439class DOMParser;
440
442template<typename DOMDocumentType>
444 public:
446 DOMDocumentWrapper(DOMDocumentType *me_) : me(me_) {}
451 XercesUniquePtr<xercesc::DOMElement> validate();
454 xercesc::DOMElement* createElement(const FQN &name);
456 std::shared_ptr<DOMParser> getParser() const;
459 boost::filesystem::path getDocumentFilename() const;
464 xercesc::DOMNode* evalRootXPathExpression(std::string xpathExpression, xercesc::DOMElement* context=nullptr);
467 xercesc::DOMElement* locateElement(const std::vector<int> &idx) const;
469 typename std::conditional<std::is_same<DOMDocumentType, const xercesc::DOMDocument>::value,
471 return this;
472 }
473 private:
474 DOMDocumentType *me;
475};
477template<typename DOMDocumentType>
478DOMDocumentWrapper<DOMDocumentType> D(DOMDocumentType *me) { return DOMDocumentWrapper<DOMDocumentType>(me); }
480template<typename DOMDocumentType>
481DOMDocumentWrapper<DOMDocumentType> D(const std::shared_ptr<DOMDocumentType> &me) { return DOMDocumentWrapper<DOMDocumentType>(me.get()); }
483template<typename DOMDocumentType>
484DOMDocumentWrapper<DOMDocumentType> D(const XercesUniquePtr<DOMDocumentType> &me) { return DOMDocumentWrapper<DOMDocumentType>(me.get()); }
485
486class LocationInfoFilter : public xercesc::DOMLSParserFilter {
487 public:
488 void setParser(DOMParser *parser_) { parser=parser_; }
489 xercesc::DOMLSParserFilter::FilterAction acceptNode(xercesc::DOMNode *n) override;
490 xercesc::DOMLSParserFilter::FilterAction startElement(xercesc::DOMElement *e) override;
491 xercesc::DOMNodeFilter::ShowType getWhatToShow() const override;
492 void setLineNumberOffset(int offset) { lineNumberOffset=offset; }
493 private:
494 DOMParser *parser;
495 int lineNumberOffset { 0 };
496};
497
498class TypeDerivativeHandler : public xercesc::PSVIHandler, virtual public fmatvec::Atom {
499 public:
500 void setParser(DOMParser *parser_) { parser=parser_; }
501 void handleElementPSVI(const XMLCh *localName, const XMLCh *uri, xercesc::PSVIElement *info) override;
502 void handleAttributesPSVI(const XMLCh *localName, const XMLCh *uri, xercesc::PSVIAttributeList *psviAttributes) override;
503 private:
504 DOMParser *parser;
505};
506
507class UserDataHandler : public xercesc::DOMUserDataHandler {
508 public:
509 void handle(DOMOperationType operation, const XMLCh* key, void *data, const xercesc::DOMNode *src, xercesc::DOMNode *dst) override;
510};
511
512extern UserDataHandler userDataHandler;
513
514class EntityResolver : public xercesc::XMLEntityResolver {
515 public:
516 void setParser(DOMParser *parser_) { parser=parser_; }
517 xercesc::InputSource* resolveEntity(xercesc::XMLResourceIdentifier *resourceIdentifier) override;
518 private:
519 DOMParser *parser;
520};
521
523class DOMParser : public std::enable_shared_from_this<DOMParser> {
524 friend class TypeDerivativeHandler;
525 friend class LocationInfoFilter;
526 friend class UserDataHandler;
527 friend class EntityResolver;
528 friend class DOMElementWrapper<xercesc::DOMElement>;
529 friend class DOMElementWrapper<const xercesc::DOMElement>;
530 template<typename> friend class DOMDocumentWrapper;
531 public:
535 static std::shared_ptr<DOMParser> create(const std::variant<boost::filesystem::path, xercesc::DOMElement*> &xmlCatalog=static_cast<xercesc::DOMElement*>(nullptr));
539 std::shared_ptr<xercesc::DOMDocument> parse(const boost::filesystem::path &inputSource,
540 std::vector<boost::filesystem::path> *dependencies=nullptr,
541 bool doXInclude=true);
545 std::shared_ptr<xercesc::DOMDocument> parse( std::istream &inputStream,
546 std::vector<boost::filesystem::path> *dependencies=nullptr,
547 bool doXInclude=true);
551 xercesc::DOMElement* parseWithContext(const std::string &str, xercesc::DOMNode *contextNode, xercesc::DOMLSParser::ActionType action,
552 std::vector<boost::filesystem::path> *dependencies=nullptr,
553 bool doXInclude=true);
556 static void serialize(xercesc::DOMNode *n, const boost::filesystem::path &outputSource);
559 static void serializeToString(xercesc::DOMNode *n, std::string &outputData);
563 std::shared_ptr<xercesc::DOMDocument> createDocument();
564
565 const std::map<FQN, xercesc::XSTypeDefinition*>& getTypeMap() const { return typeMap; }
566 private:
567 xercesc::DOMImplementation *domImpl;
568 DOMParser(const std::variant<boost::filesystem::path, xercesc::DOMElement*> &xmlCatalog);
569 std::shared_ptr<xercesc::DOMLSParser> parser;
570 std::map<FQN, xercesc::XSTypeDefinition*> typeMap;
571 DOMErrorPrinter errorHandler;
572 LocationInfoFilter locationFilter;
573 TypeDerivativeHandler typeDerHandler;
574 EntityResolver entityResolver;
575 std::map<std::string, boost::filesystem::path> registeredGrammar;
576
577 static void handleXInclude(xercesc::DOMElement *&e, std::vector<boost::filesystem::path> *dependencies);
578};
579
580}
581
582namespace {
583
584template<class T>
585void CheckSize<T>::check(const xercesc::DOMElement *me, const T &value, int r, int c) {}
586template<class T>
587void CheckSize<std::vector<T>>::check(const xercesc::DOMElement *me, const std::vector<T> &value, int r, int c) {
588 if(r!=0 && r!=static_cast<int>(value.size()))
589 throw MBXMLUtils::DOMEvalException("Expected vector of size "+fmatvec::toString(r)+
590 " but got vector of size "+fmatvec::toString(value.size())+".", me);
591}
592template<class T>
593void CheckSize<std::vector<std::vector<T>>>::check(const xercesc::DOMElement *me, const std::vector<std::vector<T>> &value, int r, int c) {
594 if(r!=0 && r!=static_cast<int>(value.size()))
595 throw MBXMLUtils::DOMEvalException("Expected matrix of row-size "+fmatvec::toString(r)+
596 " but got matrix of row-size "+fmatvec::toString(value.size())+".", me);
597 if(!value.empty() && c!=0 && c!=static_cast<int>(value[0].size()))
598 throw MBXMLUtils::DOMEvalException("Expected matrix of col-size "+fmatvec::toString(c)+
599 " but got matrix of col-size "+fmatvec::toString(value[0].size())+".", me);
600}
601
602}
603
604#endif
Helper class for extending DOMAttr (use the function A(...)).
Definition: dom.h:411
DOMAttrWrapper(DOMAttrType *me_)
Wrap DOMAttr to my special element.
Definition: dom.h:414
std::string getRootXPathExpression() const
Definition: dom.cc:732
bool isDerivedFrom(const FQN &baseTypeName) const
Definition: dom.cc:726
std::conditional< std::is_same< DOMAttrType, constxercesc::DOMAttr >::value, constDOMAttrWrapper *, DOMAttrWrapper * >::type operator->()
Treat this object as a pointer (like DOMAttr*)
Definition: dom.h:423
Helper class for extending DOMDocument (use the function D(...)).
Definition: dom.h:443
xercesc::DOMElement * locateElement(const std::vector< int > &idx) const
Definition: dom.cc:858
boost::filesystem::path getDocumentFilename() const
Definition: dom.cc:790
xercesc::DOMElement * createElement(const FQN &name)
Definition: dom.cc:776
DOMDocumentWrapper(DOMDocumentType *me_)
Wrap DOMDocument to my special element.
Definition: dom.h:446
std::conditional< std::is_same< DOMDocumentType, constxercesc::DOMDocument >::value, constDOMDocumentWrapper *, DOMDocumentWrapper * >::type operator->()
Treat this object as a pointer (like DOMDocument*)
Definition: dom.h:470
xercesc::DOMNode * evalRootXPathExpression(std::string xpathExpression, xercesc::DOMElement *context=nullptr)
Definition: dom.cc:818
XercesUniquePtr< xercesc::DOMElement > validate()
Definition: dom.cc:741
std::shared_ptr< DOMParser > getParser() const
Get full qualified tag name.
Definition: dom.cc:784
Helper class for extending DOMElement (use the function E(...)).
Definition: dom.h:262
void setOriginalElementLineNumber(int lineNr)
Set the line number of the original element.
Definition: dom.cc:688
std::string getRootXPathExpression() const
Definition: dom.cc:613
void setEmbedCountNumber(int embedCount)
Definition: dom.cc:590
std::conditional< std::is_same< DOMElementType, constxercesc::DOMElement >::value, constDOMElementWrapper *, DOMElementWrapper * >::type operator->()
Treat this object as a pointer (like DOMElement*)
Definition: dom.h:389
std::string getAttribute(const FQN &name) const
Get attribute named name.
Definition: dom.cc:504
const xercesc::DOMComment * getFirstCommentChild() const
Get first child comment.
Definition: dom.cc:402
bool hasAttribute(const FQN &name) const
check if this element has a attibute named name.
Definition: dom.cc:695
const xercesc::DOMProcessingInstruction * getFirstProcessingInstructionChildNamed(const std::string &target) const
Get first child processing instruction of the specified target.
Definition: dom.cc:351
const xercesc::DOMText * getFirstTextChild() const
Definition: dom.cc:421
boost::filesystem::path getOriginalFilename(bool skipThis=false, const xercesc::DOMElement *&found=DOMElementWrapper< DOMElementType >::dummyArg) const
Definition: dom.cc:462
int getEmbedCountNumber() const
Definition: dom.cc:581
std::vector< int > getElementLocation() const
Definition: dom.cc:661
FQN getAttributeQName(const FQN &name) const
Get attribute named name of type QName.
Definition: dom.cc:510
void addProcessingInstructionChildNamed(const std::string &target, const std::string &data)
Add a processing instruction child of the specified target.
Definition: dom.cc:374
const xercesc::DOMAttr * getAttributeNode(const FQN &name) const
Get attribute node named name.
Definition: dom.cc:521
const xercesc::DOMElement * getNextElementSiblingNamed(const FQN &name) const
Get next sibling element of the specified full qualified name.
Definition: dom.cc:334
void removeAttribute(const FQN &name)
remove from this element the attibute named name.
Definition: dom.cc:576
std::string getEmbedData(const std::string &name) const
Get the embed data named name from the current element. Returns "" if not such data exists.
Definition: dom.cc:380
boost::filesystem::path convertPath(const boost::filesystem::path &relPath) const
Definition: dom.cc:496
T getText(int r=0, int c=0) const
Get the child text as type T.
Definition: dom.h:302
void setEmbedXPathCount(int xPathCount)
Definition: dom.cc:606
const xercesc::DOMElement * getFirstElementChildNamed(const FQN &name) const
Get first child element of the specified full qualified name.
Definition: dom.cc:317
bool isDerivedFrom(const FQN &baseTypeName) const
Definition: dom.cc:717
void setOriginalFilename(boost::filesystem::path orgFileName=boost::filesystem::path())
Definition: dom.cc:489
void setAttribute(const FQN &name, const T &value)
Set attribute.
Definition: dom.h:378
FQN getTagName() const
Get full qualified tag name.
Definition: dom.h:267
int getOriginalElementLineNumber() const
Get the line number of the original element.
Definition: dom.cc:679
DOMElementWrapper(DOMElementType *me_)
Wrap DOMElement to my special element.
Definition: dom.h:265
void addEmbedData(const std::string &name, const std::string &data)
Definition: dom.cc:392
int getEmbedXPathCount() const
Definition: dom.cc:597
int getLineNumber() const
Definition: dom.cc:567
Print DOM error messages.
Definition: dom.h:248
Definition: dom.h:194
static std::string convertToString(const EmbedDOMLocator &loc, const std::string &message, bool subsequentError=false)
Definition: dom.cc:1003
A XML DOM parser.
Definition: dom.h:523
std::shared_ptr< xercesc::DOMDocument > createDocument()
create a empty document
Definition: dom.cc:1448
xercesc::DOMElement * parseWithContext(const std::string &str, xercesc::DOMNode *contextNode, xercesc::DOMLSParser::ActionType action, std::vector< boost::filesystem::path > *dependencies=nullptr, bool doXInclude=true)
Definition: dom.cc:1366
std::shared_ptr< xercesc::DOMDocument > parse(const boost::filesystem::path &inputSource, std::vector< boost::filesystem::path > *dependencies=nullptr, bool doXInclude=true)
static void serialize(xercesc::DOMNode *n, const boost::filesystem::path &outputSource)
Definition: dom.cc:1398
static void serializeToString(xercesc::DOMNode *n, std::string &outputData)
Definition: dom.cc:1419
void resetCachedGrammarPool()
reset all loaded grammars
Definition: dom.cc:1443
static std::shared_ptr< DOMParser > create(const std::variant< boost::filesystem::path, xercesc::DOMElement * > &xmlCatalog=static_cast< xercesc::DOMElement * >(nullptr))
Definition: dom.cc:1152
Definition: dom.h:123
std::string getRootHRXPathExpression() const
get human readable (simple) XPath expression to the location
Definition: dom.cc:288
const std::string & getRootXPathExpression() const
get a (simple) XPath expression to the location: each element is prefixed with the namespace URI betw...
Definition: dom.h:147
Definition: dom.h:514
Definition: dom.h:109
FQN(const char *name)
Anonymous FQN (required for implicit casting of string literals to anonymous FQNs)
Definition: dom.h:116
FQN(const std::string &ns, const std::string &name)
FQN.
Definition: dom.h:118
FQN()=default
Empty FQN.
FQN(const std::string &name)
Anonymous FQN.
Definition: dom.h:114
Initialize Xerces on load and terminate it on unload of the library/program.
Definition: dom.h:74
Definition: dom.h:486
Helper class to easily construct full qualified XML names (FQN) using XML namespace prefixes.
Definition: dom.h:162
Definition: dom.h:507
Definition: dom.h:86